使用Powermock测试Spring控制器
问题内容:
我有一个测试特定控制器的类,它可以正常工作
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:config/test-applicationContext-config.xml")
@TestExecutionListeners({
WebContextTestExecutionListener.class,
DependencyInjectionTestExecutionListener.class,
DirtiesContextTestExecutionListener.class })
public class TestAdminController {
//.....
}
我在那里使用了来自mockito.org的 Google
Mockito库来模拟我的基础bean。
现在,我的问题如下:
我也需要模拟一些类,但是它们具有final
方法,而Google的模拟似乎无法解决此问题。我的一位同事建议使用powermock.org中的Powermock。但这需要使用注解对测试器类进行@RunWith(PowerMockRunner.class)
注解。如果使用此方法,则必须删除注释@RunWith(SpringJUnit4ClassRunner.class)
,这将给我带来问题,因为将不会创建Spring测试上下文。我如何避免这种情况?
建议后,我已配置为使用PowerMockRule
而不是@RunWith
注释
我的项目Maven依赖项如下
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-mockito-release-full</artifactId>
<version>1.5</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4-rule</artifactId>
<version>1.5</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-classloading-xstream</artifactId>
<version>1.5</version>
<scope>test</scope>
</dependency>
现在我的课看起来像这样(另一个控制器测试)
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:config/test-applicationContext-config.xml")
@TestExecutionListeners({
WebContextTestExecutionListener.class,
DependencyInjectionTestExecutionListener.class,
DirtiesContextTestExecutionListener.class })
@PrepareForTest(ADSynchronizationImpl.class)
public class ThirdPartyLoginControllerTest {
@Rule
public PowerMockRule rule = new PowerMockRule();
@Autowired
private ThirdPartyLoginController thirtPartyLoginController;
@Autowired
private MockFactoryForControllers mockFactory;
@Test
public void testLoginActiveDirectory(){
}
}
但是运行测试后,我得到以下异常跟踪
com.thoughtworks.xstream.converters.ConversionException:javassist.NotFoundException:com.somecompany.analytics.manager.db.api.MlDao
$$ EnhancerByMockitoWithCGLIB $$
b86d7415:javassist.NotFoundException:com.somecompany.analytics.manager.db。
MlDao $$ EnhancerByMockitoWithCGLIB $$ b86d7415 ----调试信息----
消息:javassist.NotFoundException:com.somecompany.analytics.manager.db.api.MlDao
$$ EnhancerByMockitoWithCGLIB $$ b86d7415原因-java.lang。
RuntimeException原因消息:javassist.NotFoundException:com.somecompany.analytics.manager.db.api.MlDao
$$ EnhancerByMockitoWithCGLIB $$
b86d7415类:com.somecompany.ui.controllers.ThirdPartyLoginController必需类型:com.somecompany.ui.controller
.ThirdPartyLoginController转换器类型:com.thoughtworks。xstream.converters.reflection.ReflectionConverter路径:/org.powermock.modules.junit4.rule.PowerMockStatement$1/outer-
class/fNext/fTarget/thirtPartyLoginController/mlDao行号:14类1
:com.somecompany.ui.controllers.ThirdPartyLoginControllerTest类2
:org.junit.internal.runners.statements.InvokeMethod类[3]
:org.powermock.modules.junit4.rule.PowerMockStatement类[4]
:org.powermock。 modules.junit4.rule.PowerMockStatement $ 1版本
:null -----------------------------------
com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:
79)在com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:65)在com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:66)在com.thoughtworks.xstream.converters.reflection
com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:306)处的com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal.AbstractReflectionConverter.unmarshallField(AbstractReflectionConverter.java:355)
:234),位于com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:72)。thinkworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:65)位于com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:66)位于com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter(un。
com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:306)(位于com.thoughtworks.xstream.converters.reflection.AbstractCommissionworks.xstream.converters.reflection.AbstractCommission.java:355)com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:306)
.com.thoughtworks.xstream.core。com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshallField(AbstractReflectionConverter.java:355)上的TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:66)在com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.do:
306),位于com.thoughtworks.xstream.core.com的com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:72)的com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:234)处。
com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:66)处com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter处的AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:65)。com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.com)的unmarshallField(AbstractReflectionConverter.java:355)在com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:306)在com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:72)在com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:65)在com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother
(com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:50)处的com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:134)(com.thoughtworks。)
xstream.core。com.thoughtworks.xstream.XStream.XStream.unmarshal(XStream.java:1052)位于com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1036)位于com.thoughtworks.xstream.com上的AbstractTreeMarshallingStrategy.unmarshal(AbstractTreeMarshallingStrategy.java:32)
com.thoughtworks.xstream.XStream.fromXML(XStream.java:912)在org.powermock.classloading.DeepCloner.clone(DeepCloner.java:54)在com.thoughtworks.xstream.XStream.fromXML(XStream.java:903)在org.powermock。
org.powermock.classloading.ClassloaderExecutor.execute(ClassloaderExecutor.java:78)上的classloading.ClassloaderExecutor.execute(ClassloaderExecutor.java:89)org.powermock.modules.junit4.rule.PowerMockStatement.evaluate(PowerMockRule.java:49)在org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)在org。在org.springframework.test的org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)的springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:82)
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)上的context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:240)在org.junit.runners.ParentRunner
$ 3.run(ParentRunner.java:238)上org.junit.runners.ParentRunner $
1.schedule(ParentRunner.java:63)at
org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)at
org.junit.runners.ParentRunner.access $ 000(ParentRunner.java:
53)在org.springframework.test.context.junit4.statement的org.junit.runners.ParentRunner
$
2.evaluate(ParentRunner.java:229)中。org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)处的RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)在org.junit.runners.ParentRunner.run(ParentRunner.java:309)在org.eclipse.jdt上的org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)上的org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:180)
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)的org.eclipse.jdt.internal.junit的.internal.junit.runner.TestExecution.run(TestExecution.java:38)
.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390),位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)造成原因:java.lang.RuntimeException:javassist.NotFoundException:com.somecompany.idm.analytics.manager.db。
org.powermock.core.classloader.MockClassLoader.loadUnmockedClass(MockClassLoader.java:199)上的api.MlDao
$$ EnhancerByMockitoWithCGLIB $$ b86d7415 at
org.powermock.core.classloader.MockClassLoader.loadModifiedClass(MockClassLoader.java:在com.thoughtworks.xstream.core.util.ClassLoaderReference.loadClass(ClassLoaderReference.java:java.lang.ClassLoader.loadClass(ClassLoader.java:356)处的powermock.core.classloader.DeferSupportingClassLoader.loadClass(DeferSupportingClassLoader.java:67)
31)在com.thoughtworks处com.thoughtworks.xstream.mapper.DefaultMapper.realClass(DefaultMapper.java:49)。位于com.thoughtworks.xstream.mapper.DynamicProxyMapper.realClass(DynamicProxyMapper.java:55)处的xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)位于com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:
30)在com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)在com.thoughtworks.xstream.mapper.PackageAliasingMapper.realClass(PackageAliasingMapper.java:88)在com.thoughtworks.xstream.mapper.ClassAliasingMapper
com处com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)处的.realClass(ClassAliasingMapper.java:79)com处com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)处的.realClass(MapperWrapper.java:30)。在com.thoughtworks.xstream.mapper.MapperWrapper上的Thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)。com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)处的com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)处的realClass(MapperWrapper.java:30)
com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)处的.xstream.mapper.ArrayMapper.realClass(ArrayMapper.java:74)com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java)
:30),位于com.thoughtworks.xstream.mapper的com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)的com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)。
com.thoughtworks.xstream中的MapperWrapper.realClass(MapperWrapper.java:30)在com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)在com.thoughtworks.xstream中。位于com.thoughtworks.xstream.mapper.CachingMapper.realClass(CachingMapper.java:45)处的mapper.MapperWrapper.realClass(MapperWrapper.java:30)位于com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.determineType(AbstractReflectionConverter.java:
458)在com.thoughtworks.xstream上com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:234)上com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:294)
.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:72)…
57更多原因:javassist.NotFoundException:com.somecompany.analytics.manager.db.api.MlDao
$$ EnhancerByMockitoWithCGLIB $$ b86d7415 at javassist.ClassPool.get
(ClassPool.java:450),位于org.powermock.core。classloader.MockClassLoader.loadUnmockedClass(MockClassLoader.java:192)…还有87个
问题答案:
看一下这篇文章,它解释了如何使用PowerMock和SpringJUnit4ClassRunner
。基本上,您只需要使用一条特殊PowerMockRule
规则:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:config/test-applicationContext-config.xml")
@TestExecutionListeners({
WebContextTestExecutionListener.class,
DependencyInjectionTestExecutionListener.class,
DirtiesContextTestExecutionListener.class })
public class SpringExampleTest {
@Rule
public PowerMockRule rule = new PowerMockRule();
}
编辑:似乎其他人与您有同样的问题@PowerMockRule
。使用PowerMockAgent可以解决您的情况。