Android,PowerMock:androidTest文件夹中的测试类:javassist.NotFoundException:

时间:2017-04-09 12:47:42

标签: powermock

我想在我的Android应用上测试静态方法。

我的build.gradle:

dependencies {
    androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2'
    androidTestCompile "org.mockito:mockito-android:2.7.21"
    androidTestCompile "org.powermock:powermock-api-mockito:1.6.6"
    androidTestCompile 'org.powermock:powermock-module-junit4:1.6.6'

    testCompile 'junit:junit:4.12'
    testCompile 'org.powermock:powermock-api-mockito:1.6.6'
    testCompile 'org.powermock:powermock-module-junit4:1.6.6'
}

我对Android应用的PowerMock测试:

import static org.hamcrest.MatcherAssert.assertThat;
import static org.mockito.Mockito.when;
import static org.powermock.api.mockito.PowerMockito.mockStatic;

@RunWith(PowerMockRunner.class)
@PrepareForTest(StringUtil.class)
public class StringUtilInstrumentedTest {
    private Context context;

    @Before
    public void init() {
        context = InstrumentationRegistry.getTargetContext();
    }

    @Test
    public void decliningAge() {
        mockStatic(StringUtil.class);

        // use Mockito to set up your expectation
        String expected = "first";
        when(StringUtil.calcAge(context, 1)).thenReturn(expected);
        assertThat(StringUtil.calcAge(context, 1), is(expected));     
    }
}

但是当我尝试开始测试时,抛出异常:

I/TestRunner(32154): java.lang.ClassNotFoundException: com.mycompany.StringUtilInstrumentedTest
I/TestRunner(32154):    at java.lang.Class.classForName(Native Method)
android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1879)
I/TestRunner(32154): Caused by: java.lang.IllegalStateException: Failed to transform class with name com.mycompany.StringUtilInstrumentedTest. Reason: com.mycompany.StringUtilInstrumentedTest
org.powermock.core.classloader.MockClassLoader.loadMockClass(MockClassLoader.java
I/TestRunner(32154): Caused by: javassist.NotFoundException: com.mycompany.StringUtilInstrumentedTest
I/TestRunner(32154):    at javassist.ClassPool.get(ClassPool.java:452)

为什么我会收到此错误?

1 个答案:

答案 0 :(得分:1)

如果StringUtilInstrumentedTest位于src/test/java,则可以使用PowerMock。但如果它在src/androidTest/java,那么它将无效。

PowerMock不适用于Android Instrumentation测试。请参阅:https://github.com/powermock/powermock/issues/594

  

对于迟到的回复感到抱歉。如果您在设备上运行它,PowerMock将无法在Android上运行,因为PowerMock正在使用JVM字节代码操作。如果你在JVM上运行它,它将会工作。