我有一个Spring Boot项目,需要使用spring测试运行器进行测试(这样我才能获得真实的应用程序上下文)并模拟静态方法。
@RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes= MyApplication.class) @PrepareForTest(StaticClass.class) public class StaticClassTest { @Rule public PowerMockRule rule = new PowerMockRule(); @Autowired HelloCmd hello; @Test public void testGetOne() { mockStatic(StaticClass.class); when(StaticClass.getNumber()).thenReturn(2); System.out.println(hello.getNumber()); } }
并且在运行测试时收到以下错误消息:
com.thoughtworks.xstream.converters.ConversionException: hello.hystrix.commands.HelloCmd$$EnhancerBySpringCGLIB$$a27be1be : hello.hystrix.commands.HelloCmd$$EnhancerBySpringCGLIB$$a27be1be ---- Debugging information ---- message : hello.hystrix.commands.HelloCmd$$EnhancerBySpringCGLIB$$a27be1be cause-exception : com.thoughtworks.xstream.mapper.CannotResolveClassException cause-message : hello.hystrix.commands.HelloCmd$$EnhancerBySpringCGLIB$$a27be1be class : hello.hystrix.commands.StaticClassTest required-type : hello.hystrix.commands.StaticClassTest converter-type : com.thoughtworks.xstream.converters.reflection.ReflectionConverter path : /org.powermock.modules.junit4.rule.PowerMockStatement$1/outer-class/fNext/next/next/target/hello line number : 15 class[1] : org.junit.internal.runners.statements.InvokeMethod class[2] : org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks class[3] : org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks class[4] : org.powermock.modules.junit4.rule.PowerMockStatement class[5] : org.powermock.modules.junit4.rule.PowerMockStatement$1 version : null
如何解决这个问题?谢谢!
我从这里的链接中找到了一个修复方法, 可以使用PowerMockRunnerDelegate代替PowerMockRule。
更新的测试类为:
@RunWith(PowerMockRunner.class) @PowerMockRunnerDelegate(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes= MyApplication.class) @PrepareForTest(StaticClass.class) public class StaticClassTest { @Autowired HelloCmd hello; @Test public void testGetOne() { mockStatic(StaticClass.class); when(StaticClass.getNumber()).thenReturn(2); System.out.println(hello.getNumber()); } }