[英]Mockito Throwing NullpointerException while calling doCallRealMethod
我正在使用 Mockito 版本 3.6.28 进行 Junit 测试。 在 object 上调用真实方法时出现 Nullpointer 异常。这是因为没有正确注入对目标 object 的依赖。这是我正在使用的代码。
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中的Nullpointer Exceptions通常是你说的缺少依赖导致的。
在你的情况下, ClassA
被相应地注入,但是当涉及到ClassB
时,它是一个Mock
object (即没有注入依赖项)。
因此,您必须在使用ClassB
时注入Mock
的ClassB
。
就像是
@Test
public void testMethod(){
@InjectMocks
ClassB classB_1;
doCallRealMethod().when(classB_1).doSomething();
classA.doSomething();
}
问题是您只将模拟注入 ClassA 而不是注入 ClassB:
@InjectMocks
ClassA classA;
@Mock
private LoggingService loggingService;
@Mock
private ClassB classB;
所以,ClassB 中的 loggingService 是 null(它没有被注入),所以它抛出 NullPointerException。
问题是,如果您正在测试 ClassA - 很可能您不应该调用 ClassB 的真实方法,您应该模拟它。
但是,如果您必须这样做,也有办法。
InelliJ 建议最好使用构造函数而不是@Autowire
(使用 lombok 很容易做到)。 当您使用构造函数注入依赖项时,传递如下模拟会容易得多:
private ClassB classB = new ClassB (mock(LoggingService.class));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.