一. 后盾单元测试中 run, 和 debug 模式测试后果不同
目前测试 controller 控制器下 update 办法的流程图
目前问题出在参数捕捉上。在 debug 模式下,当我用一行行执行上来的时候 ,执行到上面第二行 entityArgumentCaptor.getValue() 的时候测试报错说 并没有捕捉到数据。
1 Mockito.verify(this.Service).update(longArgumentCaptor.capture(),
entityArgumentCaptor.capture());
2 Assertions.assertEquals(oldEntity.getName(), entityArgumentCaptor.getValue().getName());
来看看报错
它说参数没有捕捉,可能是因为 两个起因 。
1. 可能 没有 verify()中应用 argument.captrue()。
2. 可能 在某个桩中应用的 capture(), 然而没有被调用 。并举荐只在 verify() 中应用 capture()。
最初还贴心地给出例子:
然而和上述代码一比拟就发现 用法齐全和举荐的统一。
而后又试着间接用run 模式测试,后果居然通过了。
最初测试了很久,报错起因是我 没有把 verify()里的两个参数写在同一行,如图 204 行和 205 行
在我没有把参数写在同一行的时候,debug 模式下 ,点下一步,跳到 204 行,接着跳到 205 行, 而后不知为何又跳回 204 行。而 204 行只有 id 的参数捕捉。
通过测试,两个捕捉器都没有捕捉到参数。
猜想可能是因为 debug 是一行一行地执行语句,当不把参数写在同一行时,执行就可能出错,语句间接失败。
之后把参数放在同一行之后,debug 模式下执行后果正确。
二.jpa 参数不容许为 null
情景:查问参数 name 为空时显示所有数据,前台向后盾传了查问条件 name 为 null
在测试的时候发现报错
jpa 定义的查问
Page<PropertyCompany> findAllByNameContainingAndDeletedIsFalse(String name, Pageable pageable);
起因:jpa 的 findByXXX 参数不容许为 null。
解决办法:
1:service 层加判断, 为 null 时设置为空字符串。
public Page<PropertyCompany> page(String name, @NotNull Pageable pageable) {if (name == null) {name = "";}
2. 自定义查问:
default Page<PropertyCompany> findAll(String name, @NotNull Pageable pageable) {Specification<PropertyCompany> specification = PropertyCompanySpecs.containingName(name);
return this.findAll(specification, pageable);
}
public class PropertyCompanySpecs {public static Specification<PropertyCompany> containingName(String name) {if (name != null && !name.trim().isEmpty()) {return (root, criteriaQuery, criteriaBuilder) -> criteriaBuilder.like(root.get("name").as(String.class), String.format("%%%s%%", name.trim()));
} else {return Specification.where(null);
}
}
}
如果的确想要查问 name 为 null 的字段怎么办?
能够应用:findByNameIsNull 相当于 sql 语句 where name is null
三 传值问题
背景为 angular 中父组件调用子组件,并让子组件操作传入的数组。
父组件 :定义了 villages: Village[];
并在 v 层中传给了子组件
<component [setVillages]="villages"></component>`
子组件:为了防止在应用 villages.push 等操作的时候,因为传入的 villages 是 undefined 而导致报错, 做了以下操作:
if (village === undefined) {villages = new Array<Village>();
}
后果:子组件最初对 villages 的操作影响不到父组件的 villages,父组件中的 villages 还是 undefined。
解决办法:父组件中定义 villages 初始变量应该这么定义:villages = new Array<Village>();
目前认为是:跟 c 语言相似, 如果函数的参数不传入参数地址,代表着操作的只是一份数据的拷贝。而如果传入参数的地址,代表着操作的是真正传入数据,函数外的那个变量也会随之扭转。
在这里,数组如果在子组件 new Array(), 代表内存在子组件这里开拓,对数据的操作并不影响父组件的数据. 而如果数组在父组件这里开拓空间,就代表子组件操作的是父组件的数据。