我使用Mockito版本3.6.28进行Junit测试。我得到空指针异常,而调用对象上的真正方法。这是因为对目标对象的依赖没有正确注入,这就是我正在使用的代码。
public class ClassA{
@Autowired
LoggingService loggingService;
@Autowired
ClassB classB;
publc void doSomething(){
loggingService.info("info log"); // This will works fine
classB.doSomething();
}
}
public class ClassB{
@Autowired
LoggingService loggingService;
public void doSomething(){
loggingService.info("info log"); // Nullpointer on this line since loggingService is null
}
}
@RunWith(MockitoJUnitRunner.Silent.class)
public class TestClass{
@InjectMocks
ClassA classA;
@Mock
ClassB classB;
@Mock
private LoggingService loggingService;
@Test
public void testMethod(){
doCallRealMethod().when(classB).doSomething();
classA.doSomething();
}
}
Mockito中的空指针异常通常是由缺少依赖关系引起的。
在你的情况下,ClassA
被相应地注入,但当涉及到ClassB
时,它是一个Mock
对象(即没有注入依赖项)。
因此,在使用ClassB
的同时,必须注入ClassB
的Mock
's。
@Test
public void testMethod(){
@InjectMocks
ClassB classB_1;
doCallRealMethod().when(classB_1).doSomething();
classA.doSomething();
}
问题是您只向类a注入mock而不向类b注入mock:
@InjectMocks
ClassA classA;
@Mock
private LoggingService loggingService;
@Mock
private ClassB classB;
所以,ClassB中的loggingService是空的(它没有被注入),所以它抛出NullPointerException。
问题是,如果你正在测试类a——很可能你不应该调用类b的真正方法,你应该模拟它。
如果你必须这么做,总有办法的。
InelliJ建议最好使用构造函数而不是@Autowire
(使用lombok很容易做到)。当您使用构造函数注入依赖项时,传递类似
private ClassB classB = new ClassB (mock(LoggingService.class));