我正在使用JMockit来测试正在自动装配的类(弹簧)。从这个post中,我可以理解,我将不得不手动将模拟实例注入ClassToBeTested。即使我这样做,我也会在NullPointerEx行遇到Deencapsulation.setField(classUnderTest, mockSomeInterface);,因为classUnderTest和mockSomeInterface都是null。但是,如果我在@Autowire上使用mockSomeInterface,它会自动正确连接。

要测试的类:

@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
    }
}

07-24 09:24