单元测试中mock的使用

137 阅读1分钟

@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);
    }

}

持续更新。。。