请不要将其标记为重复,我无法解决此问题。
我正在使用 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/