繁体   English   中英

Mockito 调用 doCallRealMethod 时抛出 NullpointerException

[英]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时注入MockClassB

就像是

 @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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM