我正在开发SDK,我正在尝试对其执行UnitTests。 这意味着我的项目大部分是纯Java代码,在某些地方涉及Android代码。 我想在我的SDK上执行UnitTest,我决定使用Roboelectric,Mockito和PowerMock(静态方法模拟)。
除了一个问题,一切正常: 当我的测试调用任何包含Android类的方法时,我的测试崩溃(由于Stub问题)。 我知道我无法测试Activity,Views和更多类,但问题是即使我的函数包含对Log类的使用,我也会得到RuntimeException。
我该如何处理这个问题? 我决定使用纯UnitTest,因为除了Log类之外,我的大部分代码都不包含Android类。通过使用纯java UnitTest,我不需要运行任何设备,因此我可以同时执行多测试任务。
我试图在我的gradle中包含android.jar文件,但它没有用。
我该怎么办? 1.坚持使用纯Java UnitTest:那么如何忽略/导入Log指令。 2.转到Android测试框架:对我的需求最好的是什么?
以下是我的gradle文件中与测试相关的部分:
robolectric {
// configure the set of classes for JUnit tests
include '**/*UnitTest.class'
// confgure max heap size of the test JVM
maxHeapSize = '2048m'
// configure the test JVM arguments
jvmArgs '-XX:MaxPermSize=512m', '-XX:-UseSplitVerifier'
// configure whether failing tests should fail the build
ignoreFailures true
// use afterTest to listen to the test execution results
afterTest { descriptor, result ->
println "Executing test for {$descriptor.name} with result: ${result.resultType}"
}
}
dependencies {
androidTestCompile 'org.robolectric:robolectric:2.3'
androidTestCompile 'junit:junit:4.10'
androidTestCompile 'org.mockito:mockito-core:1.8.5'
androidTestCompile 'org.powermock:powermock-mockito-release-full:1.4.9'
androidTestCompile files('../libs-test/json.jar')
}
这是一个TestCase类的示例:
import android.util.Log;
import junit.framework.TestCase;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.junit.Test;
import org.json.JSONObject;
import static org.powermock.api.mockito.PowerMockito.when;
@RunWith(PowerMockRunner.class)
@PrepareForTest(StaticInClass.class)
public class ClassExampleUnitTest extends TestCase{
@Test
public void testSimple(){
Log.d("UnitTest", "test");
assertTrue(true);
}
}
答案 0 :(得分:1)
当您使用PowerMockRunner运行时,您实际上并未通过robolectric运行。通常,当你需要robolectric框架时,你会这样运行:
@RunWith(RobolectricTestRunner.class)