单元测试
这是我的项目目录结构:
其中,所有的SQL操作都在mapper.xml中
单元测试
采用了Mockitoverify方法:
- 验证方法执行过几次:
verify(tBookController, times(1)).queryTBookByName(captor.capture());
- 验证方法执行过几次:
如上代码所示,验证了tBookController的queryTBookByName方法执行了一次,其中captor是用来捕获传入参数的:
ArgumentCaptor<String> captor=ArgumentCaptor.forClass(String.class);
。
never() 没有被调用,相当于times(0)
atLeast(N) 至少被调用N次
atLeastOnce() 相当于atLeast(1)
atMost(N) 最多被调用N次
2. 超时验证verify(mock, timeout(100)).someMethod();
- when假设测试条件:
String name = "c++"; List<TBook> result = new ArrayList<TBook>(); for(int i = 0; i < 2; i++){ TBook tb = new TBook(); tb.setBkId(i); tb.setBkName("Spring in action"+i); tb.setBkIsbn("123"+i); tb.setBkPage(100+i); tb.setBkState(i); result.add(tb); } //when是为了假设一个场景 when(tBookController.queryTBookByName(name)).thenReturn(result);
然后通过执行测试方法进行验证:
List<TBook> tbooks = tBookController.queryTBookByName(name); tbooks = tBookController.queryTBookByName(name); tbooks = tBookController.queryTBookByName(name); ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class); verify(tBookController, times(3)).queryTBookByName(captor.capture()); //getValue()得到捕获参数的最近一次赋值, getAllValues()得到所有参数 assertEquals(name, captor.getValue()); assertThat(tbooks, is(result));
- 测试类的注解和自动注入
@RunWith(MockitoJUnitRunner.class) public class MybatisOpTest { @Mock private TBookController tBookController = new TBookController(); @Autowired private TBookMapper tBookMapper;
其中,@Autowired后面的这个mapper不要也无所谓,因为已经通过@Mock模拟了一个controller。由于这是一个SpringBoot程序,所以也不需要通过@ContextConfiguration注解引入一个xml配置项。
这样就可以通过mock的假数据进行测试了!
集成测试会比较复杂一点,在下一篇里面会具体说明!