PowerMockito.doReturn().when()与Mockito.when().thenReturn()的区别
2017-09-27 11:11
537 查看
点击打开链接
PowerMockito.doReturn().when()与Mockito.when().thenReturn()的区别
1.当使用PowerMockito.doReturn(null).when(handler, "getFareRules", Integer.valueOf(requestDTO.getFareId()), "GB");时
handler的getFareRules方法不会被真的调用,在getFareRules里面打一些日志,这些日志不会输出,也就是说根本没有真的去调用该方法,而是直接
调用了代理方法,返回在doReturn设置的值。
2.当使用Mockito.when(handler.getFareRules(Integer.valueOf(requestDTO.getFareId()), "GB")).thenReturn(new FareRules());时
handler.getFareRules方法会被调用,该方法如下:
[java] view
plain copy
@Override
public FareRules getFareRules(final int fareId, final String languageCode) {
FareRules f= this.fareRulesDataProvider.getFareRules(fareId, languageCode);//fareRulesDataProvider被mock
dataProvider.getFFMarketList("CX", "REV");//dataProvider没有被mock
List<Fare> fares = fareDateProvider.getFareListByPromotionCode("aaa");//被mock
fareRulesDataProvider.hashCode();
return f;
}
我们设置调用该方法时,返回一个new的FareRules,在执行
Mockito.when(handler.getFareRules(Integer.valueOf(requestDTO.getFareId()), "GB")).thenReturn(new FareRules());
这句时,会报错,我发现,
第一句
FareRules f= this.fareRulesDataProvider.getFareRules(fareId, languageCode);
f的值是Null
第二句
dataProvider.getFFMarketList("CX", "REV");
出现nullpointexception,因为dataProvider没有mock,也就是Null
第三句
List<Fare> fares = fareDateProvider.getFareListByPromotionCode("aaa");
出现错误说getFareListByPromotionCode不能访问FareRules,它应该返回List<Fare>
也就是说该方法里面所有被mock的外部调用,它都访回thenReturn中设置的值。
但是为什么第一句返回null而不是我们设置的new FareRules呢?这是因为在执行这句Mock语句时,它仅仅会返回一个null,到执行测试的时候,
去调用handler.getFareRules, 才会返回我们设置的new FareRules.
补充一下:
1. 如果用a = Mockito.spy(a);然后通过PowerMockito来使用a的话,有些情景下会报错。
2. 前面说PowerMockito.doReturn(null).when(handler, "getFareRules", Integer.valueOf(requestDTO.getFareId()), "GB"); 这样调用
getFareRules方法不会被调用,前提是getFareRules是一个public的方法,如果是private的方法,getFareRules仍然会被调用。
3. 如果mock的方法是void的,可以使用Mockito.doNothing().when(a).aaa(); 但是在测试时发一个问题,如果像下面这样的话,会报错
PowerMockito.doReturn(null).when(a, "aaa");//aaa是一个私有方法
PowerMockito.doNothing().when(a, "bbb");//bbb是一个void的方法
也就是说如果先mock了一个私有方法,那么再mock一个void方法的时候会报错说这个bbb的mock方法没有设置返回值。
但是如果不mock那个私有方法的话,就正常。我猜是在mock私有方法的时候,mockito框架做了一些特殊的处理,但还不知道确切的原因是什么。
4. 关于mock的时候mock的方法是否会被调用,我发现如果是spy的对象,结果和我上面的结论是一样的,如果是纯mock的对象,使用
Mockito.when(handler.getFareRules(Integer.valueOf(requestDTO.getFareId()), "GB")).thenReturn(new FareRules());
这样的mock方式,被Mock的方法是不会被调用的。
PowerMockito.doReturn().when()与Mockito.when().thenReturn()的区别
1.当使用PowerMockito.doReturn(null).when(handler, "getFareRules", Integer.valueOf(requestDTO.getFareId()), "GB");时
handler的getFareRules方法不会被真的调用,在getFareRules里面打一些日志,这些日志不会输出,也就是说根本没有真的去调用该方法,而是直接
调用了代理方法,返回在doReturn设置的值。
2.当使用Mockito.when(handler.getFareRules(Integer.valueOf(requestDTO.getFareId()), "GB")).thenReturn(new FareRules());时
handler.getFareRules方法会被调用,该方法如下:
[java] view
plain copy
@Override
public FareRules getFareRules(final int fareId, final String languageCode) {
FareRules f= this.fareRulesDataProvider.getFareRules(fareId, languageCode);//fareRulesDataProvider被mock
dataProvider.getFFMarketList("CX", "REV");//dataProvider没有被mock
List<Fare> fares = fareDateProvider.getFareListByPromotionCode("aaa");//被mock
fareRulesDataProvider.hashCode();
return f;
}
我们设置调用该方法时,返回一个new的FareRules,在执行
Mockito.when(handler.getFareRules(Integer.valueOf(requestDTO.getFareId()), "GB")).thenReturn(new FareRules());
这句时,会报错,我发现,
第一句
FareRules f= this.fareRulesDataProvider.getFareRules(fareId, languageCode);
f的值是Null
第二句
dataProvider.getFFMarketList("CX", "REV");
出现nullpointexception,因为dataProvider没有mock,也就是Null
第三句
List<Fare> fares = fareDateProvider.getFareListByPromotionCode("aaa");
出现错误说getFareListByPromotionCode不能访问FareRules,它应该返回List<Fare>
也就是说该方法里面所有被mock的外部调用,它都访回thenReturn中设置的值。
但是为什么第一句返回null而不是我们设置的new FareRules呢?这是因为在执行这句Mock语句时,它仅仅会返回一个null,到执行测试的时候,
去调用handler.getFareRules, 才会返回我们设置的new FareRules.
补充一下:
1. 如果用a = Mockito.spy(a);然后通过PowerMockito来使用a的话,有些情景下会报错。
2. 前面说PowerMockito.doReturn(null).when(handler, "getFareRules", Integer.valueOf(requestDTO.getFareId()), "GB"); 这样调用
getFareRules方法不会被调用,前提是getFareRules是一个public的方法,如果是private的方法,getFareRules仍然会被调用。
3. 如果mock的方法是void的,可以使用Mockito.doNothing().when(a).aaa(); 但是在测试时发一个问题,如果像下面这样的话,会报错
PowerMockito.doReturn(null).when(a, "aaa");//aaa是一个私有方法
PowerMockito.doNothing().when(a, "bbb");//bbb是一个void的方法
也就是说如果先mock了一个私有方法,那么再mock一个void方法的时候会报错说这个bbb的mock方法没有设置返回值。
但是如果不mock那个私有方法的话,就正常。我猜是在mock私有方法的时候,mockito框架做了一些特殊的处理,但还不知道确切的原因是什么。
4. 关于mock的时候mock的方法是否会被调用,我发现如果是spy的对象,结果和我上面的结论是一样的,如果是纯mock的对象,使用
Mockito.when(handler.getFareRules(Integer.valueOf(requestDTO.getFareId()), "GB")).thenReturn(new FareRules());
这样的mock方式,被Mock的方法是不会被调用的。
相关文章推荐
- PowerMockito.doReturn().when()与Mockito.when().thenReturn()的区别
- Mockito实现原理探析 -- Mockito.when(...).thenReturn(...)的一个简化实现
- PowerMockito(PowerMock用法)
- 如何用PowerMockito 测试静态方法
- mockito when void throw exception
- Mockito&PowerMockito实战
- junit单体测试(PowerMockito)一
- powermock mockito mock static
- PowerMockito使用详解
- PowerMockito使用详解
- 用maven搭建 testNG+PowerMock+Mockito测试框架
- PowerMockito实践<二>
- PowerMockito使用详解
- Mockito与PowerMock
- 基于Spring的PowerMockito TestCase
- 基于JUnit使用PowerMock的Mockito扩展在Maven测试项目中的配置说明
- 使用 Spring + Mockito+PowerMock +spring-test-dbunit+hsqldb 进行单元测试可实现100%覆盖率
- PowerMock+Mockito+MockMvc实现Controller,Service,Mapper全覆盖测试
- Mockito InjectMocks Issue when integrated with Spring Annotation
- Mockito 库、powermock扩展