常用的单元测试方法:基于DB(真实的情况),基于Mock(模拟的情况)
为什么使用:
创建mock对象并定义其行为来模拟数据对象的提供者以保证测试环境始终相同;
应用的场景:
具体使用:(使用mock做常用的测试)
@Log4j2
@RunWith(MockitoJUnitRunner.class)
public class MyTest {
@Autowired
protected OutboundManager manager;
@Test
public void MyTest() {
List mockito = mock(ArrayList.class);
boolean addSuccess = mockito.add("one");
log.info(addSuccess);//因为是模拟的 所以添加不会成功
log.info(mockito);//Mock for List, hashCode: 1664576493
mockito.clear();
mockito.add("two");
mockito.add("one");
// verify(mockito).add("one");//验证是否调用add("one")
verify(mockito).clear();
verify(mockito, times(2)).add("one");
verify(mockito, atLeast(2)).add("one");
verify(mockito, never()).add("xiaosong");
// verifyNoMoreInteractions(mockito); 判断是否有冗余的方法调用
}
@Test
public void MyTest2() {
List mockito = mock(ArrayList.class);
when(mockito.get(0)).thenReturn("offset 0");
when(mockito.get(0)).thenReturn("offset 1");
log.info(mockito.get(0));
//使用参数匹配 如果一个参数使用了则全部需要使用
when(mockito.get(anyInt())).thenReturn("element anyInt");
}
@Test
public void MyTest3() {
List mockito = mock(ArrayList.class);
List spy = spy(mockito);
when(spy.get(anyInt())).thenReturn("2", "3", "4");//打桩 stub 返回之后返回的值 到最后肯定只返回 4
log.info(spy.get(10));
log.info(spy.get(20));
log.info(spy.get(30));
log.info(spy.get(40));
}
}