【发布时间】:2020-07-27 23:21:35
【问题描述】:
我在测试 lombok 带注释的类时遇到了一个问题。 说明:-
当我们用@Builder注解一个java类(POJO),并且有一个带有@NonNull约束的实例变量时,在编写测试用例检查NullPointerException时,我们不能实例化POJO 与 builder 并期望它会根据 null 检查进行评估。我对类进行了 deomboked,发现非 null 约束在生成的 builder 类本身内部流动,这意味着甚至在我们构造对象之前就抛出了一个空指针异常。这是一个在某种意义上是正确的行为,但我需要知道我是否可以测试这样的场景。
@Builder
public class Sample {
@NonNull
private final String a;
private final String b;
}
现在我需要测试在“a”为 Null 的情况下引发 NullPointerException 的情况。 对于这种情况,我有 2 个选择:
- 我可以使用构造函数创建示例类 -
new Sample(null, null) - 或者我可以通过构建器创建 -
Sample.builder.a(null).build();
我的问题在第二部分,因为第一个可以正常工作。 当我delombok时,我会得到类似的东西:-
public class Sample {
@NonNull
private final String a;
private final String b;
Sample(@NonNull String a, String b) {
this.a = a;
this.b = b;
}
public static SampleBuilder builder() {
return new SampleBuilder();
}
public static class SampleBuilder {
private @NonNull String a;
private String b;
SampleBuilder() {
}
public SampleBuilder a(@NonNull String a) {
this.a = a;
return this;
}
public SampleBuilder b(String b) {
this.b = b;
return this;
}
public Sample build() {
return new Sample(a, b);
}
public String toString() {
return "Sample.SampleBuilder(a=" + this.a + ", b=" + this.b + ")";
}
}
}
如果您看到 NullPointerException 将在 SampleBuilder 内部抛出,因为它需要 @NonNull 参数,并且构造函数将永远不会执行条件来检查非空属性,因为测试覆盖率会下降。如果我们使用 @SuperBuilder ,这不会发生,因为它不会在构建器参数中使用 @NonNull。
【问题讨论】:
标签: java lombok builder-pattern