问题一:对于老项目,关于Mockito和PowerMock的版本有哪些建议?
对于老项目,关于Mockito和PowerMock的版本有哪些建议?
参考回答:
对于老项目,建议不要大规模改动Mockito和PowerMock的版本,以避免复杂的包排除问题
关于本问题的更多回答可点击原文查看:https://developer.aliyun.com/ask/615460
问题二:应用启动报 Can not load this fake sdk class 的异常是为啥?
应用启动报 Can not load this fake sdk class 的异常是为啥?
参考回答:
这是因为阿里的tair,metaq基于pandora容器的,fake-sdk默认是pandora模块类加载加载的。具体原理可以参考下图:
关于本问题的更多回答可点击原文查看:https://developer.aliyun.com/ask/615461
问题三:应用启动报 Can not load this fake sdk class 怎么解决?
应用启动报 Can not load this fake sdk class 怎么解决?
参考回答:
解决方案1,引入pandoraboot环境。@RunWith(PandoraBootRunner.class)这样其实减慢了单测的运行速度,是违背了高效性原理的。但是相比较运行整个容器,运行pandora容器的时间大概在10s左右,还是能够容许的。那么有没有不让pandoraboot起来,纯mock的方法。我个人认为mock要比ut更优先 ,特别是有些外部依赖,经常迁移或者下线,可能改了1行代码,需要修1个小时测试用例。tair,lindorm等中间件也没有办法本地起环境进行mock,直接依赖外部资源非常不优雅。
解决方案2,直接mock
@RunWith(PowerMockRunner.class)@PrepareForTest({DataEntry.class})public class MockTair { @Mock private DataEntry dataEntry; @Before public void hack() throws Exception { //solve it should be loaded by Pandora Container. Can not load this fake sdk class. please refer to http://gitlab.alibaba-inc.com/middleware-container/pandora-boot/wikis/faq for the solution PowerMockito.whenNew(DataEntry.class).withNoArguments().thenReturn(dataEntry); } @Test public void mock() throws Exception { String value = "value"; PowerMockito.when(dataEntry.getValue()).thenReturn(value); DataEntry tairEntry = new DataEntry(); //值相等 Assert.assertEquals(value.equals(tairEntry.getValue())); }}
关于本问题的更多回答可点击原文查看:https://developer.aliyun.com/ask/615462
问题四:为什么要尽量使用ioc?
为什么要尽量使用ioc?
参考回答:
使用 IOC 可以解耦对象,使得测试更加方便。经常有这样的情况,在某个 service 中使用到某个工具类,这个工具类内的方法都是 static 的,这样的话,测试 service 的时候就会需要连着工具类一起测试了。
关于本问题的更多回答可点击原文查看:https://developer.aliyun.com/ask/615463
问题五:如何测试void?
如何测试void?
参考回答:
如果void方法内部造成了数据库的变更,比如insertPlan(Plan plan),并通过H2操作过数据库,那么可以验证数据库的条数变化等,校验void方法的正确性。
如果void方法调用了函数,可以通过verify验证方法得到调用次数:
userService.updateName(1L,"qiushuo");verify(mockedUserRepository, times(1)).updateName(1L,"qiushuo");
• 如果void方法可能会造成抛出异常。
可以通过dothrow来 mock方法抛出的异常:
@Test(expected = InvalidParamException.class)public void testUpdateNameThrowExceptionWhenIdNull() { doThrow(new InvalidParamException()) .when(mockedUserRepository).updateName(null,anyString(); userService.updateName(null,"qiushuo");}
关于本问题的更多回答可点击原文查看:https://developer.aliyun.com/ask/615464