У меня есть служебный класс, который называется StringProcessor. В нем breakLongWords() метод добавляет пробелы нулевой ширины к входу всякий раз, когда последовательности символов не хватает пробела для заданной длины:

public class StringProcessor {

    private static final int WORD_MAX_LENGTH = 40;

    public String breakLongWords(CharSequence input) {
        // add a zero-width space character after a word
        // if its length is greater than WORD_MAX_LENGTH and doesn't have any space in it
    }
}

Статическое поле WORD_MAX_LENGTH является подробностью реализации и не должно быть доступно другим классам (включая тестовые классы).

Теперь, как я могу проверить крайний случай в JUnit без доступа к WORD_MAX_LENGTH? Например:

@Test
public void breakLongWords_EdgeCase() {
    String brokenText = stringProcessor.breakLongWords
            ("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); // its length should be = WORD_MAX_LENGTH 

    assertEquals(41, brokenText.length()); // 41 (WORD_MAX_LENGTH + 1) is also hard-coded here
}
4
Mahozad 20 Авг 2018 в 23:59

3 ответа

Лучший ответ

Обычно такие поля делаются «пакетно-закрытыми» (то есть без модификатора доступа), а модульные тесты помещаются в один и тот же пакет.
Таким образом, константы видны для тестов и классов из одного пакета и скрыты для других.

4
Mahozad 21 Авг 2018 в 08:10

У вас есть два варианта:

  1. Экспонируйте WORD_MAX_LENGTH для ваших тестов.

  2. Поддерживайте вторую константу для тестов.

2
Code-Apprentice 20 Авг 2018 в 21:02

Я мог бы перепроектировать StringProcessor и тест.

public class StringProcessor {

    private static final int WORD_MAX_LENGTH = 40;

    public boolean stringLengthIsSafe(CharSequence input){
        if(input.length()>WORD_MAX_LENGTH){
           return false;
        }
        return true;
    }

    public String breakLongWords(CharSequence input) {
        // add a zero-width space character after a word
        // if its length is greater than WORD_MAX_LENGTH and doesn't have any space in it
    }
}

А потом тест на логическое значение.

@Test
public void breakLongWords_EdgeCase() {
    boolean safeString = stringProcessor.stringLengthIsSafe
            ("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); // its length should be = WORD_MAX_LENGTH 

    assertEquals(true, safeString); // 41 (WORD_MAX_LENGTH + 1) is also hard-coded here
}

В вашей окончательной реализации breakLongWords может реализовать stringLengthIsSafe, прежде чем пытаться манипулировать CharSequence.

0
J E Carter II 20 Авг 2018 в 21:12
51938401