powermock/powermock

Android, PowerMock: javassist.NotFoundException:

Open

#776 建立於 2017年4月9日

在 GitHub 查看
 (8 留言) (0 反應) (0 負責人)Java (4,072 star) (585 fork)batch import
androidbuggood first issue

描述

I want to test static method in my Android app.

My 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'
}

My PowerMock test for Android app: in folder /app/src/androidTest/java/com/mycompany/StringUtilInstrumentedTest .java

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));     
        }
    }

But when I try to start test, throw exception:

I/TestRunner(32154): ----- begin exception -----
I/TestRunner(32154): java.lang.ClassNotFoundException: com..StringUtilInstrumentedTest
I/TestRunner(32154):	at java.lang.Class.classForName(Native Method)
I/TestRunner(32154):	at java.lang.Class.forName(Class.java:324)
I/TestRunner(32154):	at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.createDelegatorFromClassloader(JUnit4TestSuiteChunkerImpl.java:161)
I/TestRunner(32154):	at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.createDelegatorFromClassloader(JUnit4TestSuiteChunkerImpl.java:48)
I/TestRunner(32154):	at org.powermock.tests.utils.impl.AbstractTestSuiteChunkerImpl.createTestDelegators(AbstractTestSuiteChunkerImpl.java:111)
I/TestRunner(32154):	at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.<init>(JUnit4TestSuiteChunkerImpl.java:71)
I/TestRunner(32154):	at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.<init>(AbstractCommonPowerMockRunner.java:32)
I/TestRunner(32154):	at org.powermock.modules.junit4.PowerMockRunner.<init>(PowerMockRunner.java:34)
I/TestRunner(32154):	at java.lang.reflect.Constructor.newInstance(Native Method)
I/TestRunner(32154):	at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:104)
I/TestRunner(32154):	at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:86)
I/TestRunner(32154):	at android.support.test.internal.runner.junit4.AndroidAnnotatedBuilder.runnerForClass(AndroidAnnotatedBuilder.java:77)
I/TestRunner(32154):	at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
I/TestRunner(32154):	at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26)
I/TestRunner(32154):	at org.junit.runner.Computer.getRunner(Computer.java:40)
I/TestRunner(32154):	at org.junit.runner.Computer$1.runnerForClass(Computer.java:31)
I/TestRunner(32154):	at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
I/TestRunner(32154):	at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:101)
I/TestRunner(32154):	at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:87)
I/TestRunner(32154):	at org.junit.runners.Suite.<init>(Suite.java:81)
I/TestRunner(32154):	at org.junit.runner.Computer.getSuite(Computer.java:28)
I/TestRunner(32154):	at android.support.test.internal.runner.TestRequestBuilder.classes(TestRequestBuilder.java:789)
I/TestRunner(32154):	at android.support.test.internal.runner.TestRequestBuilder.build(TestRequestBuilder.java:753)
I/TestRunner(32154):	at android.support.test.runner.AndroidJUnitRunner.buildRequest(AndroidJUnitRunner.java:354)
I/TestRunner(32154):	at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:260)
I/TestRunner(32154):	at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1879)
I/TestRunner(32154): Caused by: java.lang.IllegalStateException: Failed to transform class with name com..StringUtilInstrumentedTest. Reason: com..StringUtilInstrumentedTest
I/TestRunner(32154):	at org.powermock.core.classloader.MockClassLoader.loadMockClass(MockClassLoader.java:284)
I/TestRunner(32154):	at org.powermock.core.classloader.MockClassLoader.loadModifiedClass(MockClassLoader.java:192)
I/TestRunner(32154):	at org.powermock.core.classloader.DeferSupportingClassLoader.loadClass1(DeferSupportingClassLoader.java:77)
I/TestRunner(32154):	at org.powermock.core.classloader.DeferSupportingClassLoader.loadClass(DeferSupportingClassLoader.java:67)
I/TestRunner(32154):	at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
I/TestRunner(32154):	... 26 more
I/TestRunner(32154): Caused by: javassist.NotFoundException: com..StringUtilInstrumentedTest
I/TestRunner(32154):	at javassist.ClassPool.get(ClassPool.java:452)
I/TestRunner(32154):	at org.powermock.core.classloader.MockClassLoader.loadMockClass(MockClassLoader.java:262)
I/TestRunner(32154):	... 30 more
I/TestRunner(32154): ----- end exception -----

Why I get this error?

貢獻者指南