前言

断言是单测环节中非常重要的一个环节,但是又容易被忽视掉。大部分人只判断了结果有返回 / 方法没报错,就认为这个用例成功了。其实方法没报错这只是最基本的要求,而我们的 bug 往往也不是这种故障,而是里面的一些字段丢失或者有误。


注意项

  1. 结果对象的所有字段都要校验
  2. 用例中的某些对象虽然被 mock 了,但是这些 mock 的对象具体接收到了哪些参数,也需要详细的做校验。

如何校验 mock 对象的参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/**
* 普通结果的断言
*/
Assertions.assertThat(restResponse).hasFieldOrPropertyWithValue("code", 0);
/**
* mock 对象的断言
*/
new Verifications() {
{
SimpleDocVo vo;
PipelineJobJunit document;
EsClient.createDoc(vo = withCapture(), document = withCapture());

Assertions.assertThat(vo).extracting(simpleDocVo -> StringUtil.isNotEmpty(simpleDocVo.getId()));

Assertions.assertThat(document)
.hasFieldOrPropertyWithValue("pipelineJobId", jenkinsJunitVo.getUapJobId())
.hasFieldOrPropertyWithValue("status", jenkinsJunitVo.getStatus())
.hasFieldOrPropertyWithValue("allCoverage", jenkinsJunitVo.getAllCoverage())
.hasFieldOrPropertyWithValue("newCoverage", jenkinsJunitVo.getNewCoverage())
.hasFieldOrPropertyWithValue("testRun", jenkinsJunitVo.getTestRun())
.hasFieldOrPropertyWithValue("testFailure", jenkinsJunitVo.getTestFailure())
.hasFieldOrPropertyWithValue("testSkipped", jenkinsJunitVo.getTestSkipped());
}
};

上述代码的重点

捕捉 mock 对象的参数,赋值给某个变量,然后校验这个对象。

EsClient.createDoc(vo = withCapture(), document = withCapture());

效率问题

每个对象都校验代码很繁琐,感觉单测就是在写 get,set 方法。