Mockito和嵌套方法调用

时间:2013-04-19 06:47:11

标签: java mockito

我有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();
    }
}

我只需要 - 在 service2.doSomethingAnother()中使用自定义 someDao.getObj()来调用 doMain

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():service2 in null中有NPE ..

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

我是否误解@InjectMock行为?

1 个答案:

答案 0 :(得分:7)

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();

    }

}