【问题标题】:Mockito Throwing NullpointerException while calling doCallRealMethodMockito 在调用 doCallRealMethod 时抛出 NullpointerException
【发布时间】:2021-10-03 16:56:19
【问题描述】:

我正在使用 Mockito 3.6.28 版进行 Junit 测试。在对象上调用真实方法时出现 Nullpointer 异常。这是因为对目标对象的依赖没有正确注入。这是正在使用的代码。

    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();
        
    }
}

【问题讨论】:

    标签: java spring junit mockito springmockito


    【解决方案1】:

    如您所说,Mockito 中的空指针异常通常是由于缺少依赖项引起的。

    在您的情况下,ClassA 被相应地注入,但是当涉及到 ClassB 时,它是一个 Mock 对象(即没有注入依赖项)。

    因此,您必须在使用 ClassB 时注入 MockClassB

    类似

     @Test
        public void testMethod(){
    
            @InjectMocks
            ClassB classB_1;
    
            doCallRealMethod().when(classB_1).doSomething(); 
            classA.doSomething();
            
        }
    

    【讨论】:

      【解决方案2】:

      问题是您只将模拟注入 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));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多