簡體   English   中英

使用 Powermock 測試 Spring 控制器

[英]Testing Spring controllers using Powermock

我有一個測試特定控制器的類,它工作正常

@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方法,而谷歌的模擬似乎沒有解決這個問題。 我的一位同事建議使用來自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.apirr.man MlDao$$EnhancerByMockitoWithCGLIB$$b86d7415 ---- 調試信息---- 消息:javassist.NotFoundException:com.somecompany.analytics.manager.db.api.MlDao$$EnhancerByMockitoWithCGLIB$$b86d7415 原因- RuntimeException 原因消息:javassist.NotFoundException:com.somecompany.analytics.manager.db.api.MlDao$$EnhancerByMockitoWithCGLIB$$b86d7415 類:com.somecompany.ui.controllers.ThirdPartyLoginController required-type:com.ui.controllersome .ThirdPartyLoginController轉換器型:com.thoughtworks.xstream.converters.reflection.ReflectionConverter路徑:/org.powermock.modules.junit4.rule.PowerMockStatement$1/outer-class/fNext/fTarget/thirtPartyLoginController/mlDao行號:14類1 :com.somecomp any.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.xreflection.converters .AbstractReflectionConverter.unmarshallField(AbstractReflectionConverter.java:355) 在 com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:306) 在 com.thoughtworks.xstream.converters. :234) 在 com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:72) 在 com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:65) 在 com.thoughtworks.xstream.core. TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:66) 在 co m.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshallField(AbstractReflectionConverter.java:355) at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:30.comverters.at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:72) 處的reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:234) com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(Abshaller.convert(Abshaller)。在 com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:66) 在 com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshallField(AbstractReflectionConverter.java:355) 在 com.thoughtworks.xreflection.converterField(AbstractReflectionConverter.java:355) .AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:306) 在 com.thoughtworks.xstream.converters.reflection.AbstractReflectionConver ter.unmarshal(AbstractReflectionConverter.java:234) at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:72) at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller) at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:72) .thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:66) 在 com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshallField(AbstractReflectionConverter.java:355) 在 com.thoughtworks.xstream.reflectionConverters. .doUnmarshal(AbstractReflectionConverter.java:306) at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:234) at com.thoughtworks.xstream.core.TreeUnmarshaller.convert)atTreeUnmarshaller.convert(TreeUnmarshaller.convert) com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:65) 在 com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.j ava:66) 在 com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:50) 在 com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:134) 在 com.thoughtworks.xstream.core .AbstractTreeMarshallingStrategy.unmarshal(AbstractTreeMarshallingStrategy.java:32) at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1052) at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1036) at com.thoughtworks xstream.XStream.fromXML(XStream.java:912) at com.thoughtworks.xstream.XStream.fromXML(XStream.java:903) at org.powermock.classloading.DeepCloner.clone(DeepCloner.java:54) at org.powermock .classloading.ClassloaderExecutor.execute(ClassloaderExecutor.java:89) 在 org.powermock.classloading.ClassloaderExecutor.execute(ClassloaderExecutor.java:78) 在 org.powermock.modules.junit4.rule.PowerMockStatement.evaluate(PowerMockRule.java:49) ) 在 org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallback s.java:74) 在 org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:82) 在 org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java: 72) 在 org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:240) 在 org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) 在 org.junit.runners.ParentRunner$3。 run(ParentRunner.java:238) at 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.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) 在 org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java: 61) 在 org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClas sCallbacks.java:70) 在 org.junit.runners.ParentRunner.run(ParentRunner.java:309) 在 org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:180) 在 org.eclipse.jdt .internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 在 org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 在 org.eclipse.jdt.internal.junit .runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner .run(RemoteTestRunner.java:390) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 由:java.lang.RuntimeException:javassist.NotFoundException:com.somecompany.idm .analytics.manager.db.api.MlDao$$EnhancerByMockitoWithCGLIB$$b86d7415 at org.powermock.core.classloader.MockClassLoader.loadUnmockedClass(MockClassLoader.java:199) at org.powermock.co re.classloader.MockClassLoader.loadModifiedClass(MockClassLoader.java:149) at org.powermock.core.classloader.DeferSupportingClassLoader.loadClass(DeferSupportingClassLoader.java:67) at java.lang.ClassLoader.loadClass(ClassLoader.java:356) at com .thoughtworks.xstream.core.util.ClassLoaderReference.loadClass(ClassLoaderReference.java:31) at com.thoughtworks.xstream.mapper.DefaultMapper.realClass(DefaultMapper.java:49) at com.thoughtworks.xstream.mapper.MapperWrapper.realClass (MapperWrapper.java:30) at com.thoughtworks.xstream.mapper.DynamicProxyMapper.realClass(DynamicProxyMapper.java:55) at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) at com.thoughtworks。 xstream.mapper.PackageAliasingMapper.realClass(PackageAliasingMapper.java:88) at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) at com.thoughtworks.xstream.mapper.ClassAliasingMapper.realClass(ClassAliasingMapper.realClass(ClassAliasingMapper) 79) 在 com.thoughtworks.xstream.mapper.MapperWrapper.r ealClass(MapperWrapper.java:30) at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) at com.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) 在 com.thoughtworks.xstream.mapper.ArrayMapper.realClass(ArrayMapper.java:74) 在 com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 在 com.thoughtworks.xstream.mapper。 MapperWrapper.realClass(MapperWrapper.java:30) at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) at com .thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 在 com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapp er.java:30) 在 com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 在 com.thoughtworks.xstream.mapper.CachingMapper.realClass(CachingMapper.java:45) 在 com.thoughtworks.xstream .converters.reflection.AbstractReflectionConverter.determineType(AbstractReflectionConverter.java:458) 在 com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:294) 在 com.thoughtworks.Abverterconvertionconreftractioncontraction com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:294) (AbstractReflectionConverter.java:234) at com.thoughtworks.xstream.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) at 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可以解決您的問題。 另請參閱 SO 上的這個答案

您也可以嘗試使用

@PowerMockRunnerDelegate(SpringJUnit4ClassRunner.class)

請參閱此處的示例。

您可以使用 JMockit 而不是 Powermock。 它可以完成 Powermock 可以做的所有事情,並且不需要 @RunWith 子句,因此它不會干擾您的 Spring 測試運行程序。 我發現 PowerMockRule 引入的問題多於它解決的問題......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM