Задать вопрос
@akaleks

Как замокать StringJoiner?

Подскажите пожалуйста как быть? есть класс:
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 можно мокать финальные классы. Но в нашем случае это не вариант.
Инициализировать поле сразу при объявлении(тогда все работает) то же, не вариант.
  • Вопрос задан
  • 42 просмотра
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 2
@LawyerIT
IT в душе и на бумаге, Юрист по призванию
Попробуйте инициализировать validateErrorJoiner внутри метода validate:
@Override
public boolean validate(ClassRequestDto dto) {
    validateErrorJoiner = new StringJoiner("; ");
    // Ваша логика валидации
    if (validateErrorJoiner.length() > 0) {
        throw new ValidationException(validateErrorJoiner.toString());
    }
    return true;
}
Ответ написан
mayton2019
@mayton2019 Куратор тега Java
Bigdata Engineer
Тебе не нужно мокать StringJoiner. Это точно тестовый антипаттерн потому
что сам по себе Стринг джойнер не является источником данных. Это все равно
что мокать функцию синуса или квадратный корень. Это просто звучит как бред.

А мокать тебе надо твою бизнес логику которая продуцирует данные для другой
бизнес логики которая тестируется. Вот.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы