mockit在调用doCallRealMethod时抛出NullpointerException &



我使用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的同时,必须注入ClassBMock'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很容易做到)。当您使用构造函数注入依赖项时,传递类似

这样的mock会容易得多:
private ClassB classB = new ClassB (mock(LoggingService.class));

相关内容

  • 没有找到相关文章

最新更新