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