带有 Spring 自动装配的 JMockit 不工作
JMockit with Spring autowire not working
我正在使用 JMockit 测试正在自动装配的 class (spring)。从这个 post,我可以理解我将不得不手动将模拟实例注入 ClassToBeTested。即使我这样做,我在第 Deencapsulation.setField(classUnderTest, mockSomeInterface);
行 运行 进入 NullPointerEx
因为 classUnderTest 和 mockSomeInterface 都是 null
。但是,如果我在 mockSomeInterface
上使用 @Autowire
,它会自动正确连接。
Class待测:
@Service
public class ClassToBeTested implements IClassToBeTested {
@Autowired
ISomeInterface someInterface;
public void callInterfaceMethod() {
System.out.println( "calling interface method");
String obj = someInterface.doSomething();
}
}
测试用例:
public class ClassToBeTestedTest {
@Tested IClassToBeTested classUnderTest;
@Mocked ISomeInterface mockSomeInterface;
public void testCallInterfaceMethod(){
Deencapsulation.setField(classUnderTest, mockSomeInterface);
new Expectations() { {
mockSomeInterface.doSomething(anyString,anyString); result="mock data";
}};
// other logic goes here
}
}
尝试以下操作,使用最新版本的 JMockit(请注意链接的问题是从 2010 年开始的,此后该库已经发展了很多):
public class ClassToBeTestedTest
{
@Tested ClassToBeTested classUnderTest;
@Injectable ISomeInterface mockSomeInterface;
@Test
public void exampleTest() {
new Expectations() {{
mockSomeInterface.doSomething(anyString, anyString); result = "mock data";
}};
// call the classUnderTest
}
}
我正在使用 JMockit 测试正在自动装配的 class (spring)。从这个 post,我可以理解我将不得不手动将模拟实例注入 ClassToBeTested。即使我这样做,我在第 Deencapsulation.setField(classUnderTest, mockSomeInterface);
行 运行 进入 NullPointerEx
因为 classUnderTest 和 mockSomeInterface 都是 null
。但是,如果我在 mockSomeInterface
上使用 @Autowire
,它会自动正确连接。
Class待测:
@Service
public class ClassToBeTested implements IClassToBeTested {
@Autowired
ISomeInterface someInterface;
public void callInterfaceMethod() {
System.out.println( "calling interface method");
String obj = someInterface.doSomething();
}
}
测试用例:
public class ClassToBeTestedTest {
@Tested IClassToBeTested classUnderTest;
@Mocked ISomeInterface mockSomeInterface;
public void testCallInterfaceMethod(){
Deencapsulation.setField(classUnderTest, mockSomeInterface);
new Expectations() { {
mockSomeInterface.doSomething(anyString,anyString); result="mock data";
}};
// other logic goes here
}
}
尝试以下操作,使用最新版本的 JMockit(请注意链接的问题是从 2010 年开始的,此后该库已经发展了很多):
public class ClassToBeTestedTest
{
@Tested ClassToBeTested classUnderTest;
@Injectable ISomeInterface mockSomeInterface;
@Test
public void exampleTest() {
new Expectations() {{
mockSomeInterface.doSomething(anyString, anyString); result = "mock data";
}};
// call the classUnderTest
}
}