Подскажите пожалуйста как быть? есть класс:
public class ClassValidation implements ValidationService {
private StringJoiner validateErrorJoiner;
@Override
public boolean validate(ClassRequestDto dto) {
validateErrorJoiner = new StringJoiner("; ");
...какая-то логика из нескольких методов, каждый из которых проверяет отдельное поле в ДТО, при выполнении которой, если в методе находится ошибка то она записывается в validateErrorJoiner и в классе который вызывает метод validate, если validateErrorJoiner не пустой, то выкидывает exception и выводит все что лежит в validateErrorJoiner.
И все бы хорошо, но при написании тестов при обращении к validateErrorJoiner получаем НПЕ.
Замокать его нельзя. т.к. класс StringJoiner final.
Я знаю, что начиная с какой-то версии junit можно мокать финальные классы. Но в нашем случае это не вариант.
Инициализировать поле сразу при объявлении(тогда все работает) то же, не вариант.
akaleks, проблема может заключаться в том, что тесты вызывают методы, которые используют validateErrorJoiner до вызова validate, из-за чего переменная не инициализирована.
public class ClassValidation implements ValidationService {
private StringJoiner validateErrorJoiner;
@Override
public boolean validate(ClassRequestDto dto) {
validateErrorJoiner = new StringJoiner("; ");
// Ваша логика валидации
if (dto == null) {
validateErrorJoiner.add("DTO is null");
}
// Добавьте другие проверки и добавляйте ошибки в validateErrorJoiner
if (validateErrorJoiner.length() > 0) {
throw new ValidationException(validateErrorJoiner.toString());
}
return true; // или false в зависимости от логики валидации
}
// Добавьте метод для получения сообщений об ошибках
public String getValidationErrors() {
return validateErrorJoiner == null ? "" : validateErrorJoiner.toString();
}
}
Тебе не нужно мокать StringJoiner. Это точно тестовый антипаттерн потому
что сам по себе Стринг джойнер не является источником данных. Это все равно
что мокать функцию синуса или квадратный корень. Это просто звучит как бред.
А мокать тебе надо твою бизнес логику которая продуцирует данные для другой
бизнес логики которая тестируется. Вот.