我有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行为?
答案 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();
}
}