java - 使用 Mockito 执行单元测试时出现 NullPointerException

标签 java unit-testing mockito


请不要将其标记为重复,我无法解决此问题。

我正在使用 Mockito 编写单元测试。执行测试用例时,我在 MainTemplate 类@Autowired bean 上收到 NullPointerException

代码:

public abstract class Template{

  abstract public boolean isEven(String input);

  private String getName(String initial){
    return "INIT"+initial;
  }

  final public void run(String input){
   isEven(input);
   getName(input);

  }
}


模板的实现:

public class MainTemplate extends Template{

 @Autowired
 private UserUtil userUtil;

    @Override
    public boolean isEven(String input){
      return userUtil.getResult(input);  //GETTING NullPointerException here..
    }
}


Bean配置:

@Configuration
public class BeanConfiguration{
  @Bean
  public Template getBean(){
     return new MainTemplate();
  }
}

@Service
public class Executor{
 @Autowired
 private BeanConfiguration beanConfig;

 public void execute(){
   beanConfig.getBean().run("sample input");
 }

}

单元测试类:

@SpringBootTest
@RunWith(MockitoJUnitRunner.class)
public class MainTemplateTest{

  @InjectMocks
  private MainTemplate mainTemplate;

  @Mock
  private UserUtil userUtil;

  @Test
  public void isEvenTest(){

    Mockito.when(userUtil.getResult(anyString())).thenReturn(true);

    mainTemplate.isEven("input string");
  }
}


我在运行上述测试时遇到 NullPointerException。
获取 NullPointerException:

    @Override
    public boolean isEven(String input){
      return userUtil.getResult(input);  //GETTING NullPointerException, while calling from mock method
    }

最佳答案

首先,决定您是否需要mockito runner(Junit 4)/扩展(Junit 5)或Spring runner/扩展(请参阅@SpringBootTest)

我相信对于这个测试,Mockito 扩展是最佳选择 - 测试将启动并执行得更快,并且不易受 Spring 配置更改的影响。

Mockito 扩展版本

  • 删除@SpringBootTest
  • 使用构造函数注入(inject)

SpringBootTest版本

  • 删除@RunWith(MockitoJUnitRunner.class)
  • 不要使用@InjectMocks,而是使用@Autowired
  • 不要使用@Mock,而是使用@MockBean
  • 字段注入(inject)仍然是一种代码味道,帮自己一个忙,使用构造函数注入(inject)

关于java - 使用 Mockito 执行单元测试时出现 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61323907/

相关文章:

javascript - 使用 mocha 和 jsdom 进行 React 单元测试失败

java - 如何避免上课自用

java - Mockito:模拟异步方法

java - 如何模拟 application.properties 文件?

Java如何提示用户保存word文档

java - 如果添加到包中则无法编译 jar

java - 如何防止处理程序在应用程序不活动时停止其进程

python - 如何使用 django-rest 框架测试客户端发布列表

unit-testing - 对 Firebase : what's the "right way" to test/mock `transaction` s with sinon. js 的 Cloud Functions 进行单元测试

java - 从控制台打印参数