У меня есть служебный класс, который называется 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
}
3 ответа
Обычно такие поля делаются «пакетно-закрытыми» (то есть без модификатора доступа), а модульные тесты помещаются в один и тот же пакет.
Таким образом, константы видны для тестов и классов из одного пакета и скрыты для других.
У вас есть два варианта:
Экспонируйте
WORD_MAX_LENGTH
для ваших тестов.Поддерживайте вторую константу для тестов.
Я мог бы перепроектировать 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.
Новые вопросы
java
Java - это популярный язык программирования высокого уровня. Используйте этот тег, если у вас есть проблемы с использованием или пониманием самого языка. Этот тег редко используется отдельно и чаще всего используется вместе с [spring], [spring-boot], [jakarta-ee], [android], [javafx], [gradle] и [maven].