`
淘气天空lc
  • 浏览: 48071 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

mockito 很好mock框架

    博客分类:
  • java
 
阅读更多

 

package com.zero.orzprofiler.mockito;

import org.junit.Test;
import java.util.*;

import static org.mockito.Mockito.*;
/**
 * User: luochao
 * Date: 14-1-3
 * Time: 上午9:54
 */
public class MockitoTest {
    @Test
    public  void testVerify() throws RuntimeException{
        //mock create
        List mockedList = mock(List.class);
        mockedList.add("one");
        mockedList.clear();

        verify(mockedList).add("one");
        verify(mockedList).clear();
        when(mockedList.get(0)).thenReturn("l234");
//        when(mockedList.get(1)).thenThrow(new RuntimeException("runtime exception..."));

        System.out.println(mockedList.get(0));
        System.out.println(mockedList.get(2));
        System.out.println(mockedList.get(1));
        List spyList = new LinkedList();
        List spy = spy(spyList);
        spy.add("one");
        when(spy.size()).thenReturn(100);
        verify(spy).add("one");
        System.out.println(spy.size());
        doReturn("lccx").when(spy).get(2);

        //verify(mockedList).add("two");
        System.out.println(spy.get(2));

    }
}

 timetunel初始化参数

package com.taobao.timetunnel.tunnel;

import static java.lang.Thread.currentThread;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.doReturn;

import java.nio.ByteBuffer;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;

import com.taobao.timetunnel.InjectMocksSupport;
import com.taobao.timetunnel.message.Message;
import com.taobao.timetunnel.session.Attribute;
import com.taobao.timetunnel.session.Session;
import com.taobao.timetunnel.tunnel.ByteBufferMessageWatchers;
import com.taobao.timetunnel.tunnel.Cursor;
import com.taobao.timetunnel.tunnel.Group;
import com.taobao.timetunnel.tunnel.Watchable;
import com.taobao.timetunnel.tunnel.Watcher;
import com.taobao.util.Bytes;

/**
 * @{link WatcherTest}
 * @author <a href=mailto:jushi@taobao.com>jushi</a>
 * @created 2010-11-29
 * 
 */
public class WatcherTest extends InjectMocksSupport {
    @Mock
   private Session session;
   @Mock
   public Message<ByteBuffer> message;

   private Watcher<ByteBuffer> watcher;

   private static final int TIMES = 10;

   private final FakeWatchable watchable = new FakeWatchable();
  @Before
  public void setUp() throws Exception {
    doReturn(3).when(session).intValueOf(Attribute.receiveWindowSize);
    doReturn("dw").when(session).stringValueOf(Attribute.subscriber);
    doReturn(Bytes.toBuffer(0)).when(message).content();
    watcher = new ByteBufferMessageWatchers(watchable).watcher(session);
  }
@Test
  public void shouldAckedGetAndRefluxEqualsPushed() throws Exception {
    int ackedGet = 0;
    int size = 0;
    while (ackedGet + size < TIMES) {
      ackedGet += size;
      size = watcher.ackAndGet().size();
    }
    watcher.dispose();
    final int pushed = watchable.count.get();
    assertThat(watchable.reflux + ackedGet, is(pushed));
  }



  /**
   * @{link FakeWatchable}
   */
  private final class FakeWatchable implements Watchable<ByteBuffer> {


    @Override
    public void onAvaliable(final Watcher<ByteBuffer> watcher) {
      new Thread(new Runnable() {

        @Override
        public void run() {
          fireOnMessageReceived(watcher);
        }
      }, "FireOnMessageReceivedTask").start();
    }

    protected void fireOnMessageReceived(final Watcher<ByteBuffer> watcher) {
      System.out.println(currentThread().getName() + currentThread().getId());
      for (;;) {
        final Iterator<Message<ByteBuffer>> itr = Collections.singleton(message).iterator();
        final Cursor<Message<ByteBuffer>> cursor = new Cursor<Message<ByteBuffer>>() {

          @Override
          public Message<ByteBuffer> next() {
            if (itr.hasNext()) return itr.next();
            return null;
          }
        };
        watcher.onMessageReceived(cursor);
        if (itr.hasNext()) break;
        count.incrementAndGet();
      }
    }

    private int reflux;
    private final AtomicInteger count = new AtomicInteger();

    @Override
    public Group<ByteBuffer> groupOf(Watcher<ByteBuffer> watcher) {
      return new Group<ByteBuffer>() {

        @Override
        public void reclaim(Session session, List<Message<ByteBuffer>> reflux) {
          FakeWatchable.this.reflux += reflux.size();
        }

        @Override
        public void dispose() {}

      };
    }

    @Override
    public void onHasUselessMessages(Watcher<ByteBuffer> watcher) {}
}

 

1. Shorthand for mocks creation - @Mock annotation

  • Minimizes repetitive mock creation code.
  • Makes the test class more readable.
  • Makes the verification error easier to read because the field name is used to identify the mock.
1 public class ArticleManagerTest {
2    
3     @Mock private ArticleCalculator calculator;
4     @Mock private ArticleDatabase database;
5     @Mock private UserProvider userProvider;
6    
7     private ArticleManager manager;
Important! This needs to be somewhere in the base class or a test runner:
1 MockitoAnnotations.initMocks(testClass);
when(mock.someMethod("some arg"))
02   .thenThrow(new RuntimeException())
03   .thenReturn("foo");
04  
05 //First call: throws runtime exception:
06 mock.someMethod("some arg");
07  
08 //Second call: prints "foo"
09 System.out.println(mock.someMethod("some arg"));
10  
11 //Any consecutive call: prints "foo" as well (last stubbing wins).
12 System.out.println(mock.someMethod("some arg"));

 doReturn()|doThrow()doAnswer()|doNothing()|doCallRealMethod() family of methods

 

2. Spying on real objects

You can create spies of real objects. When you use the spy then the real methods are called (unless a method was stubbed).

Real spies should be used carefully and occasionally, for example when dealing with legacy code.

Spying on real objects can be associated with "partial mocking" concept. Before the release 1.8, Mockito spies were not real partial mocks. The reason was we thought partial mock is a code smell. At some point we found legitimate use cases for partial mocks (3rd party interfaces, interim refactoring of legacy code, the full article is here)

01 List list = new LinkedList();
02 List spy = spy(list);
03  
04 //optionally, you can stub out some methods:
05 when(spy.size()).thenReturn(100);
06  
07 //using the spy calls *real* methods
08 spy.add("one");
09 spy.add("two");
10  
11 //prints "one" - the first element of a list
12 System.out.println(spy.get(0));
13  
14 //size() method was stubbed - 100 is printed
15 System.out.println(spy.size());
16  
17 //optionally, you can verify
18 verify(spy).add("one");
19 verify(spy).add("two");
//you can create partial mock with spy() method:   
2 List list = spy(new LinkedList());
3  
4 //you can enable partial mock capabilities selectively on mocks:
5 Foo mock = mock(Foo.class);
6 //Be sure the real implementation is 'safe'.
7 //If real implementation throws exceptions or depends on specific state of the object then you're in trouble.
8 when(mock.someMethod()).thenCallRealMethod();


reset(mock);



行为驱动开发

19. Aliases for behavior driven development (Since 1.8.0)

Behavior Driven Development style of writing tests uses //given //when //then comments as fundamental parts of your test methods. This is exactly how we write our tests and we warmly encourage you to do so!

Start learning about BDD here: http://en.wikipedia.org/wiki/Behavior_Driven_Development

The problem is that current stubbing api with canonical role of when word does not integrate nicely with //given //when //then comments. It's because stubbing belongs to given component of the test and not to the when component of the test. Hence BDDMockito class introduces an alias so that you stub method calls with BDDMockito.given(Object) method. Now it really nicely integrates with the given component of a BDD style test!

Here is how the test might look like:

01 import static org.mockito.BDDMockito.*;
02  
03 Seller seller = mock(Seller.class);
04 Shop shop = new Shop(seller);
05  
06 public void shouldBuyBread() throws Exception {
07   //given 
08   given(seller.askForBread()).willReturn(new Bread());
09    
10   //when
11   Goods goods = shop.buyBread();
12    
13   //then
14   assertThat(goods, containBread());
15

 

分享到:
评论

相关推荐

    Spring Boot单元测试中使用mockito框架mock掉整个RedisTemplate的示例

    今天小编就为大家分享一篇关于Spring Boot单元测试中使用mockito框架mock掉整个RedisTemplate的示例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

    用Java编写的最流行的单元测试mock框架.zip

    本文件“用Java编写的最流行的单元测试mock框架.zip”主要包含了关于Mockito的相关资料,帮助开发者更好地理解和使用这个强大的工具。 Mockito是一个开源的Java库,专门设计用于创建模拟对象,以隔离被测试代码并...

    mockito中文文档.zip

    10. **Integration with Test Frameworks**:Mockito 可以很好地与其他测试框架如 JUnit、TestNG 集成,提供简洁的测试运行环境。 在使用 Mockito 进行 TDD 时,开发者应遵循以下步骤: 1. 写一个失败的测试用例,...

    Mockito Cookbook

    14. **Integration with testing frameworks**:Mockito与JUnit、TestNG等测试框架很好地集成,可以方便地在这些框架中使用Mockito的功能。 通过深入学习《Mockito Cookbook》,开发者能够掌握如何利用Mockito提升...

    springboot搭建mock

    SpringBoot作为一个流行的Java开发框架,提供了构建微服务的便捷方式,同时也能很好地支持Mock功能。下面我们将详细探讨如何使用SpringBoot搭建一个Mock平台。 首先,我们需要理解什么是Mock。Mock对象是测试中的一...

    SpringBoot项目中使用Mockito的示例代码

    在Spring Boot项目中使用Mockito是非常有用的,它可以帮助我们更好地进行单元测试和集成测试。在本文中,我们将通过示例代码来介绍如何在Spring Boot项目中使用Mockito, 以及它的优点和注意事项。 什么是Mockito?...

    java UT mockito配套代码

    这个"java UT mockito配套代码"很可能是包含了一些使用Mockito进行单元测试的示例或者模板,用于帮助开发者更好地理解和应用Mockito。 Mockito框架提供了以下核心功能: 1. **模拟对象创建**:在单元测试中,我们...

    Java_Mockito初学者教程.zip

    Java Mockito 是一种流行的单元测试框架,它允许开发者模拟对象的行为,以便在测试代码中更好地控制依赖关系。这个初学者教程将引导你深入了解Mockito的基本概念和用法。 首先,了解单元测试的重要性是至关重要的。...

    mock-confif

    2. **Mocking框架**:在Java中,有Mockito、PowerMock等框架;在JavaScript中,有sinon.js、jest等;Python有unittest.mock库。这些框架简化了创建和管理Mock对象的过程。 3. **何时使用Mocking**:通常在单元测试...

    mockito

    Mockito 是一个流行的 Java 单元测试框架,用于模拟(mock)对象以便在测试中隔离被测代码。这个框架使得开发者能够创建虚拟对象,这些对象的行为可以被预先定义,以便在测试过程中控制依赖关系,避免了对真实环境的...

    GMock——groovy下的mock工具

    - `src`:源代码文件,可能包含了 GMock 的实现细节,对于开发者来说是很好的学习资源。 - `samples`:示例代码,可以帮助初学者快速上手。 总的来说,GMock 为 Groovy 开发者提供了一种强大而灵活的工具,帮助他们...

    百灵报表 dome mock 实例 hibernate spring struts2 struts

    总的来说,这个项目是一个很好的实践平台,可以帮助Java开发者深入理解如何在实际项目中整合这些主流的开源技术,提升企业级应用开发的能力。通过研究这个示例,可以提高对ORM、MVC框架以及报表设计的理解,为日常...

    Mockito1

    7. **扩展:Mockito与其他测试工具的集成**:Mockito可以与JUnit、TestNG等测试框架很好地配合,也可以与PowerMock等库结合,用于模拟静态方法、final类和构造函数。 8. **最佳实践**: - 尽量保持测试的独立性,...

    mock:httpclient用例

    在Java中,Mock框架如Mockito可以帮助开发者创建Mock对象。它允许我们定义期望的调用和返回值,使得测试更加独立,更容易理解和维护。例如,如果你有一个依赖于HTTP服务的类,你可以Mock这个HTTP服务,让其在测试中...

    ssh框架的第三部分

    7. **测试与调试**:SSH项目通常使用单元测试工具(如JUnit)对各个组件进行测试,同时结合Mock框架(如Mockito)模拟外部依赖。Eclipse或IntelliJ IDEA等IDE提供了很好的集成支持,帮助开发者进行调试和问题定位。 ...

    mock-data

    在Java领域,`Mockito`框架虽然主要用于单元测试的模拟对象,但也有其他工具如`WireMock`可用来生成HTTP响应的Mock数据。 此外,Mock数据的使用还涉及到API测试、端到端测试以及持续集成/持续部署(CI/CD)流程。在...

    MockFramework

    通过使用Mock框架,开发者可以创建模拟对象来代替真实的类,这些模拟对象可以预定义行为并返回期望的结果,从而更好地控制测试环境,提高测试效率和代码质量。 在Java世界中,Mock框架有多个知名的选择,例如...

    dagger2Example:带有 Dagger2、Espresso 2.0 和 mockito 的 Android 单元测试示例

    4. **数据绑定**:Espresso可以很好地与Android Data Binding库结合使用,进行更复杂的UI测试。 5. **异步UI测试**:Espresso支持等待和监听,如`onIdle()`和`onView()`的`hasDescendant()`,确保在正确的时间执行...

    Easymock教程

    Easymock与Mockito等其他模拟框架相比,各有优缺点。Mockito更注重简洁的API和易用性,而Easymock则提供了更多高级功能和灵活性。 六、资源与学习路径 "easymock教程.srf"文件很可能是教程文档,使用SRF阅读器.exe...

    junit-mock:分支在 unti 测试中呈现不同类型的模拟

    在Java世界里,JUnit是进行单元测试的首选框架,而Mockito是它的一个流行扩展,用于创建和管理模拟对象。本文将深入探讨如何在JUnit测试中使用Mockito进行不同类型的模拟。 首先,我们要理解模拟的基本概念。模拟...

Global site tag (gtag.js) - Google Analytics