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

JUnit模拟测试在使用InjectMocks时返回null

余信然
2023-03-14

我正在尝试对服务类进行单元测试,但模拟返回null

package com.tgt.store.pricetask.pricetask_service;

import com.tgt.store.pricetask.model.PriceTaskMaster;
import com.tgt.store.pricetask.model.TaskModel;
import com.tgt.store.pricetask.repository.PriceTaskMasterRepository;
import com.tgt.store.pricetask.service.DataMigrationService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import java.time.LocalDateTime;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.*;

@RunWith(SpringJUnit4ClassRunner.class)
public class DataMigrationServiceTest {

  @Mock
  PriceTaskMasterRepository priceTaskMasterRepository;

  @InjectMocks
  DataMigrationService dataMigrationService;

  @Test
  public void
testPriceTaskMasterService_whenTaskModelPassed_thenSavePriceTaskMaster() {

    TaskModel taskModel = new TaskModel.TaskModelBuilder().setTaskID(1)
            .setDueDate("2017-11-01T11:41:00+0000").setIsAlertable("A").setIsPriority("P").setLocationid("1234")
            .createTaskModel();

    PriceTaskMaster priceTaskMaster = new PriceTaskMaster.PriceTaskMasterBuilder().setId(1L).setTaskStatus("A")
            .setAlertable("A").setPriority("P").setLocationId(1234)
            .setDueDate(LocalDateTime.now()).createPriceTaskMaster();

    when(priceTaskMasterRepository.insertPriceTaskMaster(any(PriceTaskMaster.class))).thenReturn(priceTaskMaster);

    PriceTaskMaster savedPriceTaskMaster = dataMigrationService.savePriceTaskMaster(taskModel);

    assertNotNull(savedPriceTaskMaster);
    assertEquals("A", savedPriceTaskMaster.getTaskStatus());
    assertEquals("P", savedPriceTaskMaster.getPriority());
    assertEquals(1234, savedPriceTaskMaster.getLocationId().intValue());
    assertEquals(123456789, savedPriceTaskMaster.getTcin().longValue());

    verify((priceTaskMasterRepository), times(1)).insertPriceTaskMaster(priceTaskMaster);
  }
}

在上面的代码中,当调用到达服务类时PriceTaskMasterRepository为空。我不知道我是否错过了什么。我尝试使用SpringRunnerMockitoJunitRunner运行,但结果相同。感谢任何帮助。

提前谢谢你。

共有1个答案

邢焕
2023-03-14

使用@injectmocks批注时,需要初始化DataMigrationService字段。这将创建一个被测试类的实例,并将模拟对象注入其中。

@InjectMocks
DataMigrationService dataMigrationService = new DataMigrationService();

http://www.baeldung.com/mockito-注释

 类似资料:
  • 本节介绍与JUnit Framework相关的各种模拟测试。 您可以在本地计算机上下载这些示例模拟测试,并在方便时离线解决。 每个模拟测试都提供一个模拟测试密钥,让您自己验证最终得分和评分。 JUnit Mock Test I 问题1 - 以下哪项描述正确测试? A - 测试是检查应用程序功能的过程,是否按照要求运行。 B - 测试是单个实体(类或方法)的测试。 C - 以上两者。 D - 以上都

  • 我还没有看到这个问题的答案能解决我的问题。 我有一个服务类,它是用一个存储库和一个Orika MapperFacade构建的。在测试中,我正在安排存储库调用返回的实体列表。my doReturn(testList).when(testRepository).findAllBy...似乎正在工作。我的实际结果列表包含我在模拟列表中指定的相同数量的元素(.size()),但是这些值都是空的。我对Spr

  • 我试着去模拟课堂,但我总是得到一个NPE。我见过当stubing方法时发布mockito-nullPointerException。在这篇文章中,他们这样解释: 我几乎可以肯定这也适用于我的问题。但我找不到解决办法。我已经试了10个小时了。 我还读了一些关于@autowired和@before的东西,显然@autowired是在@before之前创建的,这也可以解释我的NPE。 在@test vo

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

  • 我完全被困在java测试中;它是关于通过测试方法将字符'a'发送到JFrame组件的JTextField。 JFrame类实现KeyListener接口,并以此重写KeyPressed、KeyTyped和KeyReleased。同时,我将JTextField的所有按键转移到JFrame;在JFrame构造函数中,我有: 我想测试这种行为,然后模拟JTextField中类型a字符的操作。 我还尝试了

  • 问题内容: 我有一个Java命令行程序。我想创建JUnit测试用例以进行模拟。因为当我的程序运行时,它将进入while循环并等待用户输入。如何在JUnit中模拟呢? 问题答案: 从技术上讲,可以进行切换,但是总的来说,不直接在代码中调用它,而是添加一层间接层,这样输入源就可以从应用程序的某个位置进行控制,这样会更健壮。确切地讲,这是实现的详细信息-依赖项注入的建议很好,但是你不一定需要引入第三方框