我有3节课:

public class SomeDAO {

   // that method I'd want to catch and change
   public void getObj() { ... }

}

public class MainService {

    private Service2 service2;

    public void doMain() {
        service2.doSomethingAnother();
    }

}

public class Service2 {

    private SomeDAO someDAO

    public void doSomethingAnother() {
        someDAO.getObj();
    }
}


我所需要的-调用doMain,但在service2.doSomethingAnother()中包含自定义someDao.getObj():

public TestClass {

    @InjectMocks
    private final MainService mainService = new MainService();

    @InjectMocks
    private final Service2 service2 = new Service2();

    @Mock
    private SomeDAO someDao;

    @Test
    public void testMe() {

        // substitution
        when(someDao.getObj()).thenReturn(new MyObj());

        // then I'm calling the outer method
        mainService.doMain();

    }

}


运行该测试时,我在mainService.doMain()中有NPE:null中的service2。

在testMe对象service2内是活动的并且不是null,它已声明为类变量并已初始化。

我是否误解了@InjectMock的行为?

最佳答案

Service2不会注入到MainService中,因为它不是模拟对象。因此,您的server2对象的mainService属性是null

您还试图嘲笑太深。测试MainService的正确方法是模拟Service2而不是SomeDAO的依赖关系。

在模拟Service2的依赖关系时,最好使用SomeDAO的单独测试类。

public TestClass {

    @InjectMocks
    private MainService mainService;

    @Mock
    private Service2 service2;

    @Before
    public void setUp() {
        initMocks(this);
    }

    @Test
    public void testMe() {
        mainService.doMain();

        verify(service2).doSomethingAnother();

    }

}

07-26 03:14