乐趣区

关于springboot:记录本周遇到的问题

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

退出移动版