I have a spring boot project that needs to test with spring test runner(so that I can get the real application context) and mock the static method.
@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());
}
}
And I got following error message when run the test:
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
How to fix this? Thanks!
I found a fix from here link to use PowerMockRunnerDelegate instead of PowerMockRule.
The updated test class would be:
@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());
}
}
Spring, camel & powermock unittest:
I had also same problem with PowerMockRule. I replaced it with following annotations
@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(SpringJUnit4ClassRunner.class)
.
Also remove dependencies powermock-module-junit4-rule & powermock-classloading-xstream from Pom.xml and it works.
@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { StaticClassTest.ContextConfig.class })
@PrepareForTest({ StaticClass.class })
@PowerMockIgnore("javax.management.*")
public class StaticClassTest extends DroolsHelper {
@Before
public void setup() {
PowerMockito.mockStatic(StaticClass.class);
}
@Produce(uri = "direct:start")
private ProducerTemplate template;
/**
*
* ContextConfig.
*/
@Configuration
@Import(AppConfig.class)
public static class ContextConfig extends SingleRouteCamelConfiguration
{
@Bean
@Override
public RouteBuilder route() {
return new RouteBuilder() {
@Override
public void configure() {
from("direct:start").to("kie:kieSessionType?action=insertBody");
}
};
}
}
@Test
public void test() {
PowerMockito.when(StaticClass.anyMethod(Matchers.any(TestClass.class)).thenReturn(false);
......assert.........
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With