一.后盾单元测试中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(),代表内存在子组件这里开拓,对数据的操作并不影响父组件的数据.而如果数组在父组件这里开拓空间,就代表子组件操作的是父组件的数据。