当前位置: 首页 > 知识库问答 >
问题:

Mockito+JUnit测试返回NullPointerException

孔瑾瑜
2023-03-14

我试着去模拟课堂,但我总是得到一个NPE。我见过当stubing方法时发布mockito-nullPointerException。在这篇文章中,他们这样解释:

我几乎可以肯定这也适用于我的问题。但我找不到解决办法。我已经试了10个小时了。

我还读了一些关于@autowired和@before的东西,显然@autowired是在@before之前创建的,这也可以解释我的NPE。

在@test void getPlantSpeciesById处抛出NPE,因为foundPlantSpecies和PlantSpeciesServiceMock.getPlanySpeciesById(1)都是空的。感觉@before根本就没有运行。

@SpringBootTest(classes = PlantSpeciesService.class)
@Import({TestConfig.class})
@RunWith(MockitoJUnitRunner.class)
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class PlantSpeciesServiceTest {

@MockBean
private PlantSpeciesRepository plantSpeciesRepository;

@MockBean
private ModelMapper modelMapper;

@Autowired
private PlantSpeciesService plantSpeciesServiceMock;

@Before("com.oopa.domain.services.PlantSpeciesService")
public void setup() {
    MockitoAnnotations.initMocks(this);
    PlantSpecies tulip = new PlantSpecies();
    tulip.setId(1);
    tulip.setMinHumidity(200);
    tulip.setMaxHumidity(400);
    tulip.setName("Tulip");



    Mockito.when(plantSpeciesRepository.findById(tulip.getId())).thenReturn(
            Optional.of(this.modelMapper.map(tulip, com.oopa.dataAccess.model.PlantSpecies.class))
    );
}

@Test
void getPlantSpeciesById() {
    PlantSpecies foundPlantSpecies = plantSpeciesServiceMock.getPlantSpeciesById(1);

    System.out.println(plantSpeciesServiceMock.getPlantSpeciesById(1));
    System.out.println(foundPlantSpecies);
    System.out.println();
    assertEquals("Tulip", foundPlantSpecies.getName());
}

}

共有1个答案

卫才
2023-03-14

首先,@springboottest用于集成测试,而mockitojunitrunner用于单元测试--您不应该将它们混合使用。差别很关键...

看起来您正在尝试在这里进行单元测试,所以请尝试删除@springboottest和其他注释--基本上是除mockito Runner之外的所有注释。

在这一步之后,测试将不会尝试启动spring上下文,并且在技术上将成为一个单元测试

在这一步之后,您应该停下来,了解您到底想要测试什么-这里的单位是什么?服务?看起来是这样的,但是然后--您应该使用new创建一个服务实例,并调用real方法,在这个问题中,您试图在mock上调用该方法,这在逻辑上听起来不对....

总之,我建议首先正确理解如何编写单元测试(有没有mockito),然后再深入研究spring boot复杂但功能强大的集成测试框架。很抱歉,如果答案似乎不清楚,但我觉得问题中的代码中有太多东西看起来不对,所以问题IMO不可能用一两行代码来回答。

 类似资料:
  • 我正在使用Mockito编写一个JUnit测试用例,并得到一个NullPointerException。 在我的代码中是这样的:

  • 我目前正在研究如何测试我的ElasticSearch类的覆盖率,它实现了ResHighLevel客户端。问题是它返回指向RestHighLevelClient.class.的空指针,我是ES的新手,我不知道我哪里出错了。 这是我的ElasticSearch类: 这是我的测试案例: 我的端口已在app.properties中设置为9200。 请在这方面给我一些帮助。我真的需要解决这个问题。任何帮助都

  • 我应该如何测试异常?我可以mock connector并且我可以赋予它抛出异常的行为,但是我不明白下一步该怎么做。

  • 我有这个过滤器类,在使用junit进行测试时需要尽可能高的代码覆盖率。 和测试等级: 当我运行时,它在 线 我如何避免这种情况? 我需要调用这个方法并执行里面的任何内容来提供所需的代码覆盖。

  • 我正在尝试构建一个使用gradle作为构建工具和openjdk-11的原型。这个原型将在springboot框架上构建一个rest-api。 我的模块与rest api调用配合良好,并返回了预期结果。然而,当我现在试图为RESTAPI编写测试时,测试失败了,因为Mockito返回了空对象。如果您能了解我应该如何为这个rest api编写测试或如何修复它,我将不胜感激。 我的控制器: 服务: 模型:

  • 我正在为我的项目创建junit测试用例。我有下面的代码,我想在其中创建一个模拟, 我正在使用jUnit和mockito核心jar。我尝试了下面的代码, 使用上述代码,它在模拟loadProperties方法时抛出错误。如何模拟Spring静态类并返回我的模拟属性对象? 任何帮助都将不胜感激。