@Value注解注入的属性如何用mock
实际项目开发中,我们经常会使用@Value注解从配置文件中注入属性值,写单元测试时,在不启动容器的条件下,如何对这种属性进行mock呢?
对这种情况,Spring提供了一个很好的工具类ReflectionTestUtils来实现。
注入属性:
@Value("${upgrade.not-batch-upgrade-soft-model}")
String softModels;
对这个属性,在单测中可以这样mock:
@InjectMocks
private DeviceUpgradeOptimizeServiceImpl deviceUpgradeOptimizeService;
ReflectionTestUtils.setField(deviceUpgradeOptimizeService, "softModels","MSL-AD-L13-W07802,MSL-AD-L08-301,MSL-AD-T02-W07802B");
方法返回值为void的如何用mock
可以用 Mockito的doNothing()、doThrow()和doAnswer() 来对无返回值的函数进行Mock和验证。
例子1:
@Test
public void whenAddCalledVerfied() {
MyList myList = mock(MyList.class);
doNothing().when(myList).add(isA(Integer.class), isA(String.class));
myList.add(0, "");
}
例子2:
NewIotDeviceGroupUpgradeServiceImpl
public void updateByDirectDidAndDid(NewIotDeviceGroupUpgrade beforePO) {
newiotDeviceGroupUpgradeDao.updateByDirectDidAndDid(beforePO);
}
测试类:
@SpringBootTest
@RunWith(SpringRunner.class)
@AutoConfigureMockMvc
public class NewIotDeviceGroupUpgradeServiceTest {
@Mock
private NewIotDeviceGroupUpgradeDao newiotDeviceGroupUpgradeDao;
@InjectMocks
private NewIotDeviceGroupUpgradeServiceImpl newIotDeviceGroupUpgradeService;
@Test
public void updateByDirectDidAndDidTest() {
Mockito.doNothing().when(newiotDeviceGroupUpgradeDao).updateByDirectDidAndDid(Mockito.any());
newIotDeviceGroupUpgradeService.updateByDirectDidAndDid(null);
}
}
持续更新。。。