2016-03-02 129 views
0

我一直在使用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更多

回答

0

基於你的堆棧跟蹤我可以猜想org.elasticsearch.test.ElasticsearchIntegrationTest或超類或字段之一取決於org.apache.http.impl.client.CloseableHttpClient和類可以在Runtime中找不到,所以它意味着類不在測試類路徑中。

+0

感謝Arthur Zagretdinov ..添加httpclient jar之後,上面的異常就解決了。但我仍然得到下面異常 –

+0

我能夠運行只有當我從測試類刪除** @ RunWith(PowerMockRunner.class) @PrepareForTest(PowerMockitTest.class)**這些註釋。否則,我會得到下面的異常:java.lang.IllegalStateException:線程沒有上下文信息:線程[ID = 1,名稱=主,狀態= RUNNABLE,組=主]。此線程是否在類com.carrotsearch.randomizedtesting.RandomizedRunner運行環境下運行? –

+1

這看起來像** 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 **嘗試第一次運行。 –

相關問題