我一直在使用ElasticsearchIntegrationTest用於在沒有elasticsearch服務器的情況下測試我的代碼。我的班級中很少有私人會員,因此想到使用Powermock訪問私人會員。在運行測試時,我得到異常。PowerMock可以與ElasticsearchIntegrationTest一起使用嗎?
Powermock可以與ElasticsearchIntegrationTest一起使用?
代碼:
import org.elasticsearch.test.ElasticsearchIntegrationTest;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
@RunWith(PowerMockRunner.class)
@PrepareForTest(AbstractTest.class)
public class PowerMockitTest extends ElasticsearchIntegrationTest{
AbstractTest abstractTest = mock(AbstractTest.class);
@Test
public void testPowerMokito() throws Exception{
doReturn(internalCluster().transportClient()).when(abstractImporter, "initClient");
}
}
例外:
java.lang.IllegalStateException:無法用名org.elasticsearch.test.ElasticsearchIntegrationTest改造類。原因:無法找到org.apache.http.impl.client.CloseableHttpClient at org.powermock.core.classloader.MockClassLoader.loadMockClass(MockClassLoader.java:267) at org.powermock.core.classloader.MockClassLoader.loadModifiedClass(MockClassLoader的.java:180) 在org.powermock.core.classloader.DeferSupportingClassLoader.loadClass(DeferSupportingClassLoader.java:70) 在java.lang.ClassLoader.loadClass(ClassLoader.java:357) 在java.lang.ClassLoader.defineClass1 (本機方法) 在需要java.lang.ClassLoader.defineClass(ClassLoader.java:760) 在需要java.lang.ClassLoader.defineClass(ClassLoader.java:642) 在org.powermock.core.classloader.MockClassLoader.loadMockClass( MockClassLoader.java:270) at org.powermock.core.clas sloader.MockClassLoader.loadModifiedClass(MockClassLoader.java:180) 在org.powermock.core.classloader.DeferSupportingClassLoader.loadClass(DeferSupportingClassLoader.java:70) 在java.lang.ClassLoader.loadClass(ClassLoader.java:357) 在java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:348) at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.createDelegatorFromClassloader(JUnit4TestSuiteChunkerImpl.java :145) 在org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.createDelegatorFromClassloader(JUnit4TestSuiteChunkerImpl.java:40) 在org.powermock.tests.utils.impl.AbstractTestSuiteChunkerImpl.createTestDelegators(AbstractTestSuiteChunkerImpl.java:244 ) 在org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl。(JUnit4TestSuiteChunkerImpl.java:61) 在org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner。(AbstractCommonPowerMockRunner.java:32) 在org.powermock.modules.junit4.PowerMockRunner(PowerMockRunner.java:34) 在sun.reflect.NativeConstructorAccessorImpl.newInstance0(本機方法) 在sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 在陽光下.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在java.lang.reflect.Constructor.newInstance(Constructor.java:423) 在org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:29 ) at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:21) at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59) at org.junit.internal.builders。 AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26) at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59) at org.junit.internal.requests。ClassRequest.getRunner(ClassRequest.java:26) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference。(JUnit4TestReference.java:33) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestClassReference。( JUnit4TestClassReference.java:25) 在org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:48) 在org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader。 java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:444) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java: 675) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) at org.eclipse.jdt.internal.j unit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
造成的:javassist.CannotCompileException:找不到org.apache.http.impl.client.CloseableHttpClient 在javassist.expr.NewExpr.replace(NewExpr。 java:215) at javagist.exprEditor.loopBody(ExprEditor.java:212) at javassist.expr。 ExprEditor.doit(ExprEditor.java:91) 在javassist.CtClassType.instrument(CtClassType.java:1437) 在org.powermock.core.transformers.impl.MainMockTransformer.transform(MainMockTransformer.java:74) 的組織。 powermock.core.classloader.Mo ckClassLoader.loadMockClass(MockClassLoader.java:252) ...... 36多個
造成的:javassist.NotFoundException:org.apache.http.impl.client.CloseableHttpClient 在javassist.ClassPool.get(ClassPool.java: 452) at javassist.bytecode.Descriptor.toCtClass(Descriptor.java:592) at javassist.bytecode.Descriptor.getParameterTypes(Descriptor.java:439) at javassist.expr.NewExpr.replace(NewExpr.java:188) ... 42更多
感謝Arthur Zagretdinov ..添加httpclient jar之後,上面的異常就解決了。但我仍然得到下面異常 –
我能夠運行只有當我從測試類刪除** @ RunWith(PowerMockRunner.class) @PrepareForTest(PowerMockitTest.class)**這些註釋。否則,我會得到下面的異常:java.lang.IllegalStateException:線程沒有上下文信息:線程[ID = 1,名稱=主,狀態= RUNNABLE,組=主]。此線程是否在類com.carrotsearch.randomizedtesting.RandomizedRunner運行環境下運行? –
這看起來像** ElasticsearchIntegrationTest **使用** RandomizedRunner **來運行測試,所以然後你添加** @ RunWith(PowerMockRunner.class)**你覆蓋亞軍。我可能會建議使用以下兩種選項之一:PowerMock如何與其他jUnit運行器一起運行:[使用委託運行](https://github.com/jayway/powermock/wiki/JUnit_Delegating_Runner)或使用[jUnit規則](https:/ /github.com/jayway/powermock/wiki/PowerMockRule)。我建議先用** @ PowerMockRunnerDelegate **嘗試第一次運行。 –