`
xitongyunwei
  • 浏览: 926811 次
文章分类
社区版块
存档分类
最新评论

Mockito使用

 
阅读更多

最近用Mockito写了好多测试,之所以选中Mockito,而不是EasyMock,或者JMock,是因为我看了官方的对比文档:Mockito对比EasyMock,从文档中就可以看出来,Mockito的语法很自然,而EashMock之类的什么record,play模型显得有点多余。Mockito的所有功能都在Mockito这个类中,里面的函数按功能可分为几类:
1. 参数匹配 — 就是Matchers里的那些any开头的函数
2. Mock
3. 打桩(stub)功能 — 就是那些do什么开头的函数
4. 验证模型, 包括atLeast,atLeastOnce,atMost,only,times等。

大多数函数都很直观,看名字就能知道它的功能,下面是一些稍微复杂的用法:

1。 如何匹配变长参数?

public interface OrderDao
{
    public void saveOrders(Order ...order);
}
public class OrderServiceImpl 
{
OrderDao orderDao;

public void addOrders(Order ...o)
{
orderDao.saveOrders(o);
}
}

变长参数其实就是一个参数数组,所以可以用any(类[].class)类匹配它,像这样

public class OrderServiceImplTest
{
@Test
    public void addOrder()
    {
    OrderDao dao = mock(OrderDao.class);
    OrderServiceImpl orderService = new OrderServiceImpl(dao);
    Order o = new Order(1);
    
    //when(dao.)
    orderService.addOrders(o);
    verify(dao,times(1)).saveOrders(any(Order[].class));
    }
}

Mockito本来有个anyVararg就是作这个的,不过我用了发现不行,有点奇怪。

2. Mock和Spy的区别
如果你mock了一个类,那么这个类的所有的函数都被Mockito改写了(如果是没有返回值的函数,则什么都不作,如果是有返回值,会返回默认值,比如布尔型的话返回false,List的话会返回一个空的列表,int的话会返回0等等),如果你Spy了一个类,那么所有的函数都没有被改变,除了那些被你打过桩的函数。看例子:

public class TestServiceImpl
{
    public int getOrderCounts()
    {
    return 10;
    }
}
@Test
    public void MockVsSpy()
    {
    TestServiceImpl service = mock(TestServiceImpl.class);
        //输出0,因为该函数被Mockito改写了
    System.out.println("Order counts of mock object" + service.getOrderCounts());
    when(service.getOrderCounts()).thenReturn(2);
        //输出2, 因为我们给这个函数打了桩
    System.out.println("Order counts of mock object AFTER stubs " + service.getOrderCounts());
    
    service = new TestServiceImpl();
    service = spy(service);
        //输出10, 因为Mockito spy 不会改写已有的函数
    System.out.println("Order counts of spy object" + service.getOrderCounts());
    when(service.getOrderCounts()).thenReturn(2);
        //输出2, 因为我们给这个函数打了桩
    System.out.println("Order counts of spy object AFTER stubs " + service.getOrderCounts());
    }

3. 如何写自定义的参数匹配器

看下面的例子

public class Account
{
    private Stringname;
private Stringadddress;

public Account(String name, String address)
    {
    this.name = name;
    this.adddress = address;
    }
    ...get/set 函数
}
public interface AccountDao
{
    public void addAccount(Account a);
}

public class AccountServiceImpl
{
    AccountDao dao;
    
    public AccountServiceImpl(AccountDao dao)
    {
    this.dao = dao;
    }
    
    public void addAccount(String name, String address)
    {
    dao.addAccount(new Account(name, address));
    }
}


public class AccountServiceImplTest
{
@Test
    public void addAccount()
    {
    AccountDao dao = mock(AccountDao.class);
    AccountServiceImpl service = new AccountServiceImpl(dao);
    
    service.addAccount("obama", "white house");
    
    verify(dao).addAccount(new Account("obama", "white house"));
    }
}

上面的例子会失败,因为Mockito在做参数匹配时是根据equals函数的结果来判断两个参数是不是一样的。而我们的Account类并没有对equals作特殊的实现,所以会失败。修正的方法有三个,一个是改写Account类的equals函数。一个是用Mockito的反射相等匹配,就是把最后一句改成
verify(dao).addAccount(refEq(new Account("obama", "white house")));

最后一种方法是写一个自定义的参数匹配器,如果Account的代码不是你控制的,那么你就只能选这种方法了。这时候最后一句要改成这样:
verify(dao).addAccount(argThat(new ArgumentMatcher<Account>()
{
@Override
public boolean matches(Object argument)
{
Account person = (Account)argument;
return person.getName().equals("obama") && person.getAddress().equals("white house") ? true : false;
}
}));
分享到:
评论

相关推荐

    springboot + mockito 使用示例代码-原创

    单元测试工具mockito代码使用示例 文章地址 https://blog.csdn.net/qq_37813031/article/details/104557376

    EasyMock与Mockito 使用

    NULL 博文链接:https://zhangzhenting.iteye.com/blog/1829416

    mockito-core-4.0.0-API文档-中英对照版.zip

    赠送jar包:mockito-core-4.0.0.jar; 赠送原API文档:mockito-core-4.0.0-javadoc.jar; 赠送源代码:mockito-core-4.0.0-sources.jar; 赠送Maven依赖信息文件:mockito-core-4.0.0.pom; 包含翻译后的API文档:...

    mockito-core-4.0.0-API文档-中文版.zip

    赠送jar包:mockito-core-4.0.0.jar; 赠送原API文档:mockito-core-4.0.0-javadoc.jar; 赠送源代码:mockito-core-4.0.0-sources.jar; 赠送Maven依赖信息文件:mockito-core-4.0.0.pom; 包含翻译后的API文档:...

    Mockito+Junit5测试方法实践

    内容概要:参考Mockito官方API文档,实践框架每个特性。 适合人群:Mockito入门人员以及想全面熟悉Mockito特性的人员,做到了开箱即用。...使用建议:使用前安装好Maven及Java即可,推荐使用VSCode编辑。

    mockito-jar.zip

    mockito-all-1.10.19.jar mockito-core-4.5.1.jar mockito-junit-jupiter-4.5.1.jar mockito-junit-jupiter-4.5.1-sources.jar

    mockito-core-2.15.0-API文档-中文版.zip

    赠送jar包:mockito-core-2.15.0.jar; 赠送原API文档:mockito-core-2.15.0-javadoc.jar; 赠送源代码:mockito-core-2.15.0-sources.jar; 赠送Maven依赖信息文件:mockito-core-2.15.0.pom; 包含翻译后的API文档...

    mockito-core-3.8.0-API文档-中文版.zip

    赠送jar包:mockito-core-3.8.0.jar; 赠送原API文档:mockito-core-3.8.0-javadoc.jar; 赠送源代码:mockito-core-3.8.0-sources.jar; 赠送Maven依赖信息文件:mockito-core-3.8.0.pom; 包含翻译后的API文档:...

    mockito-core-3.8.0-API文档-中英对照版.zip

    赠送jar包:mockito-core-3.8.0.jar; 赠送原API文档:mockito-core-3.8.0-javadoc.jar; 赠送源代码:mockito-core-3.8.0-sources.jar; 赠送Maven依赖信息文件:mockito-core-3.8.0.pom; 包含翻译后的API文档:...

    powermock-api-mockito2-2.0.9-API文档-中英对照版.zip

    赠送jar包:powermock-api-mockito2-2.0.9.jar; 赠送原API文档:powermock-api-mockito2-2.0.9-javadoc.jar; 赠送源代码:powermock-api-mockito2-2.0.9-sources.jar; 赠送Maven依赖信息文件:powermock-api-...

    Mockito for spring

    Mockito for spring Mockito for spring Mockito for spring Mockito for spring Mockito for spring Mockito for spring Mockito for spring Mockito for spring Mockito for spring Mockito for spring Mockito ...

    mockito-core-3.1.0-API文档-中英对照版.zip

    赠送jar包:mockito-core-3.1.0.jar; 赠送原API文档:mockito-core-3.1.0-javadoc.jar; 赠送源代码:mockito-core-3.1.0-sources.jar; 赠送Maven依赖信息文件:mockito-core-3.1.0.pom; 包含翻译后的API文档:...

    mockito-core-3.9.0-API文档-中文版.zip

    赠送jar包:mockito-core-3.9.0.jar; 赠送原API文档:mockito-core-3.9.0-javadoc.jar; 赠送源代码:mockito-core-3.9.0-sources.jar; 赠送Maven依赖信息文件:mockito-core-3.9.0.pom; 包含翻译后的API文档:...

    SimpleMockito:使用Mockito进行单元测试

    简单的Mockito 使用Mockito进行单元测试 参考: :

    mockito-core-2.15.0-API文档-中英对照版.zip

    赠送jar包:mockito-core-2.15.0.jar; 赠送原API文档:mockito-core-2.15.0-javadoc.jar; 赠送源代码:mockito-core-2.15.0-sources.jar; 赠送Maven依赖信息文件:mockito-core-2.15.0.pom; 包含翻译后的API文档...

    mockito-1.9.5.zip

    mockito junit 单元测试 mockito junit 单元测试

    Mockito-Programming-Cookbook

    Mockito is an open source testing framework for Java released under the MIT License. The framework allows the creation of test double objects (mock objects) in automated unit tests for the purpose of ...

    mockito-1.9.0.zip

    mockito-1.9.0.zip,免费下载,需要的拿去

    Squaretest 1.6.9

    JUnit4和Mockito 使用方法: 1.用idea在线安装好Squaretest。 2.解压缩文件,替换 C:\Users\用户\AppData\Roaming\JetBrains\IntelliJIdea2022.2\plugins\Squaretest\lib\TestStarter-1.6.9 即可。 许可证输入任意...

    mockito以及mockMVC的一些使用案例

    非常适合初学者,可配合本人主页的文章进行学习

Global site tag (gtag.js) - Google Analytics