关于使用 InjectMocks 的 JUnit 模拟测试 returns null
JUnit Mock test returns null on using InjectMocks
我正在尝试对我的服务进行单元测试 class 但是模拟 returns 为 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);
}
}
在上面的代码中,当调用到达服务时class priceTaskMasterRepository
为空。我无法弄清楚我是否遗漏了什么。我试过 RunWith SpringRunner
和 MockitoJUnitRunner
但结果相同。感谢任何帮助。
提前致谢。
如果您使用 JUnit 来 运行 您的测试,那么您应该有这样的东西:
@Before
public void setup()
{
MockitoAnnotations.initMocks(this);
}
这确保您的所有模拟都已初始化。这在使用 MockitoJUnitRunner
.
时应该是不必要的
使用@InjectMocks
注解时需要初始化DataMigrationService
字段。这将创建被测 class 的一个实例,并将模拟对象注入其中。
@InjectMocks
DataMigrationService dataMigrationService = new DataMigrationService();
我正在尝试对我的服务进行单元测试 class 但是模拟 returns 为 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);
}
}
在上面的代码中,当调用到达服务时class priceTaskMasterRepository
为空。我无法弄清楚我是否遗漏了什么。我试过 RunWith SpringRunner
和 MockitoJUnitRunner
但结果相同。感谢任何帮助。
提前致谢。
如果您使用 JUnit 来 运行 您的测试,那么您应该有这样的东西:
@Before
public void setup()
{
MockitoAnnotations.initMocks(this);
}
这确保您的所有模拟都已初始化。这在使用 MockitoJUnitRunner
.
使用@InjectMocks
注解时需要初始化DataMigrationService
字段。这将创建被测 class 的一个实例,并将模拟对象注入其中。
@InjectMocks
DataMigrationService dataMigrationService = new DataMigrationService();