PowerMock 可以与 ElasticsearchIntegrationTest 一起使用吗?
Can PowerMock be used with ElasticsearchIntegrationTest?
我一直在使用 ElasticsearchIntegrationTest 在没有 elasticsearch 服务器的情况下测试我的代码。我的 class 中的私有成员很少,所以想到使用 Powermock 来访问私有成员。 运行宁测试时我得到异常。
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 的 class。原因:找不到 org.apache.http.impl.client.CloseableHttpClient
org.powermock.core.classloader.MockClassLoader.loadMockClass(MockClassLoader.java:267)
在 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)
在 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.Class.forName0(本机方法)
在 java.lang.Class.forName(Class.java:348)
在 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)
在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
在 java.lang.reflect.Constructor.newInstance(Constructor.java:423)
在 org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:29)
在 org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:21)
在 org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
在 org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26)
在 org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
在 org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:26)
在 org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.(JUnit4TestReference.java:33)
在 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)
在 org.eclipse.jdt.internal.junit.运行ner.RemoteTestRunner.运行 测试(RemoteTestRunner.java:444)
在 org.eclipse.jdt.internal.junit.运行ner.RemoteTestRunner.运行 测试(RemoteTestRunner.java:675)
在 org.eclipse.jdt.internal.junit.运行ner.RemoteTestRunner.运行(RemoteTestRunner.java:382)
在 org.eclipse.jdt.internal.junit.运行ner.RemoteTestRunner.main(RemoteTestRunner.java:192)
原因:javassist.CannotCompileException:无法找到 org.apache.http.impl.client.CloseableHttpClient
在 javassist.expr.NewExpr.replace(NewExpr.java:215)
在 org.powermock.core.transformers.impl.MainMockTransformer$PowerMockExpressionEditor.edit(MainMockTransformer.java:418)
在 javassist.expr.ExprEditor.loopBody(ExprEditor.java:212)
在 javassist.expr.ExprEditor.doit(ExprEditor.java:91)
在 javassist.CtClassType.instrument(CtClassType.java:1437)
在 org.powermock.core.transformers.impl.MainMockTransformer.transform(MainMockTransformer.java:74)
在 org.powermock.core.classloader.MockClassLoader.loadMockClass(MockClassLoader.java:252)
... 还有 36 个
原因:javassist.NotFoundException:org.apache.http.impl.client.CloseableHttpClient
在 javassist.ClassPool.get(ClassPool.java:452)
在 javassist.bytecode.Descriptor.toCtClass(Descriptor.java:592)
在 javassist.bytecode.Descriptor.getParameterTypes(Descriptor.java:439)
在 javassist.expr.NewExpr.replace(NewExpr.java:188)
... 还有 42 个
根据您的堆栈跟踪,我可以猜测 org.elasticsearch.test.ElasticsearchIntegrationTest
或 superclass 或字段之一取决于 org.apache.http.impl.client.CloseableHttpClient
并且在运行时无法找到 class ,所以这意味着 class 不在测试 class 路径中。
我一直在使用 ElasticsearchIntegrationTest 在没有 elasticsearch 服务器的情况下测试我的代码。我的 class 中的私有成员很少,所以想到使用 Powermock 来访问私有成员。 运行宁测试时我得到异常。
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 的 class。原因:找不到 org.apache.http.impl.client.CloseableHttpClient org.powermock.core.classloader.MockClassLoader.loadMockClass(MockClassLoader.java:267) 在 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) 在 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.Class.forName0(本机方法) 在 java.lang.Class.forName(Class.java:348) 在 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) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:423) 在 org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:29) 在 org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:21) 在 org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59) 在 org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26) 在 org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59) 在 org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:26) 在 org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.(JUnit4TestReference.java:33) 在 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) 在 org.eclipse.jdt.internal.junit.运行ner.RemoteTestRunner.运行 测试(RemoteTestRunner.java:444) 在 org.eclipse.jdt.internal.junit.运行ner.RemoteTestRunner.运行 测试(RemoteTestRunner.java:675) 在 org.eclipse.jdt.internal.junit.运行ner.RemoteTestRunner.运行(RemoteTestRunner.java:382) 在 org.eclipse.jdt.internal.junit.运行ner.RemoteTestRunner.main(RemoteTestRunner.java:192)
原因:javassist.CannotCompileException:无法找到 org.apache.http.impl.client.CloseableHttpClient 在 javassist.expr.NewExpr.replace(NewExpr.java:215) 在 org.powermock.core.transformers.impl.MainMockTransformer$PowerMockExpressionEditor.edit(MainMockTransformer.java:418) 在 javassist.expr.ExprEditor.loopBody(ExprEditor.java:212) 在 javassist.expr.ExprEditor.doit(ExprEditor.java:91) 在 javassist.CtClassType.instrument(CtClassType.java:1437) 在 org.powermock.core.transformers.impl.MainMockTransformer.transform(MainMockTransformer.java:74) 在 org.powermock.core.classloader.MockClassLoader.loadMockClass(MockClassLoader.java:252) ... 还有 36 个
原因:javassist.NotFoundException:org.apache.http.impl.client.CloseableHttpClient 在 javassist.ClassPool.get(ClassPool.java:452) 在 javassist.bytecode.Descriptor.toCtClass(Descriptor.java:592) 在 javassist.bytecode.Descriptor.getParameterTypes(Descriptor.java:439) 在 javassist.expr.NewExpr.replace(NewExpr.java:188) ... 还有 42 个
根据您的堆栈跟踪,我可以猜测 org.elasticsearch.test.ElasticsearchIntegrationTest
或 superclass 或字段之一取决于 org.apache.http.impl.client.CloseableHttpClient
并且在运行时无法找到 class ,所以这意味着 class 不在测试 class 路径中。