Я столкнулся с проблемой при тестировании аннотированного класса lombok. Описание :-
Когда мы аннотируем класс Java (POJO) с помощью @Builder
и имеем определенную переменную экземпляра с ограничениями @NonNull
, при написании тестового примера для проверки NullPointerException
мы не можем создать экземпляр POJO с помощью построителя и ожидать, что он будет оценивать против нулевой проверки. Я разобрал класс и увидел, что ненулевое ограничение течет внутри самого сгенерированного класса построителя, что означает, что исключение нулевого указателя генерируется еще до того, как мы создадим объект. В некотором смысле это правильное поведение, но мне нужно было знаю, могу ли я проверить такой сценарий.
@Builder
public class Sample {
@NonNull
private final String a;
private final String b;
}
Теперь мне нужно проверить случай, когда NullPointerException генерируется в случае, если «a» равно Null. Для такого сценария у меня есть 2 варианта:
- Либо я могу создать класс Sample с конструктором -
new Sample(null, null)
- Или могу создать через билдер -
Sample.builder.a(null).build();
Мой вопрос касается второй части, так как первая будет работать нормально. Когда я сделаю это, я получу что-то вроде: -
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 + ")";
}
}
}
Здесь, если вы видите, что внутри самого SampleBuilder будет выброшено исключение NullPointerException, поскольку оно принимает @NonNull
аргументов, а конструктор никогда не выполнит условие для проверки ненулевого атрибута, из-за которого упадет тестовое покрытие. Если мы используем @SuperBuilder
, этого не произойдет, поскольку это не так. возьмите @NonNull
в аргументах строителя.