【问题标题】:JUnit Mock test returns null on using InjectMocksJUnit Mock 测试在使用 InjectMocks 时返回 null
【发布时间】:2017-11-03 03:28:57
【问题描述】:

我正在尝试对我的服务类进行单元测试,但模拟返回 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时为空。我无法弄清楚我是否遗漏了什么。我试过 RunWith SpringRunnerMockitoJUnitRunner 但结果相同。任何帮助表示赞赏。

提前谢谢你。

【问题讨论】:

  • 你确定它不适用于MockitoJUnitRunner.class
  • 是的.. 非常确定
  • 如果你改用mock(PriceTaskMasterRepository.class)会发生什么?
  • 还是同样的错误
  • 我认为如果您提供一个没有注释的更简单的示例会更好。测试方法中只有两行。一个是使用 mock 模拟 priceTaskMasterRepository,然后另一个是使用该模拟对象。

标签: java unit-testing junit mockito spring-test


【解决方案1】:

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

@InjectMocks
DataMigrationService dataMigrationService = new DataMigrationService();

http://www.baeldung.com/mockito-annotations

【讨论】:

  • 谢谢@Srikanth,就是这样。我只需要初始化它。你让我免于重构我的整个代码:)
【解决方案2】:

如果你使用 JUnit 来运行你的测试,那么你应该有这样的东西:

@Before
public void setup()
{
    MockitoAnnotations.initMocks(this);
}

这可确保您的所有模拟都已初始化。在使用MockitoJUnitRunner 时,这应该是不必要的。

【讨论】:

  • Venky 提到他尝试使用 MockitoJUnitRunner 并不起作用。
  • 我看到了,所以令人费解。 (因此我关于 supposed 的注释是不必要的。)
  • 所以 OP 的问题不是这个。我不知道问题出在哪里 - 这就是为什么我还没有回答这个问题。
猜你喜欢
  • 1970-01-01
  • 2019-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多