代码单元测试问题总结:
1、测试类中引用第三方jar包类报错
问题原因:
测试的库中没有包含第三方jar包。
解决办法:
在app下gradle中加入第三方jar包配置: testImplementation files(‘libs/third.jar’)
2、自定义Shadow类不生效,还是提示找不到被Shadow类
问题原因:
检查下是不是使用了PowerMock,自测使用PowerMock后Shadow不生效
解决办法:
去掉PowerMock改用Mockito试试,或者第三方依赖都换成Shadow,我这也没啥好的方法。
3、测试单例类,有时候单条测试用例可以跑过,但是跑整个类的单元测试的时候不通过
问题原因:
setUp方法中获取单例对象,但是tearDown中没有置空,每次获取的单例对象都是一个,导致之前测试的设置的值还是生效的。
解决办法:
单例类中加一个destroy方法,把单例对象sInstance置空,每条测试用例开始前执行setUp方法,获取一个新的对象,tearDown中执行destroy方法。
4、使用PowerMock时报错:Could not initialize plugin: interface org.mockito.plugins.MockMaker (alternate: null)ClassNotFoundException
问题原因:
(1)第一种原因是Mockito和PowerMock的版本号对应关系不对。对应关系可参照下面博客:
PowerMock,遇到java.lang.ClassNotFoundException: org.mockito.cglib.proxy.MethodInterceptor
(2)没有加前面的@PowerMockIgnore({ “org.mockito.", "org.robolectric.”, “android.*” })
5、使用PowerMock时报空指针,例如,ATest类中调用B中的方法funcD,该方法中有用到上下文报错,Context是空。
解决办法:PowerMockito.doNothing().when(B对象).funcD();
6、测试配置testCoverageEnabled 时,不要在release配置中,影响运行速率,需要配置在debug中。
buildTypes {
debug{
testCoverageEnabled true
}
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}