#java #unit-testing #junit
#java #модульное тестирование #junit
Вопрос:
Я хочу написать тестовый пример junit для этого метода
public class LinkModel {
@Inject
@Optional
private String path;
private static final String CONTENTPATH="/content";
private String link;
@PostConstruct
protected void init(){
link=path;
if(StringUtils.isNotBlank(path) amp;amp; isInternal()){
link=path "";
}
private boolean isInternal(){
return path.contains(CONTENTPATH);
}
public String getLink() {
return link;
}
}
Я знаю, что методы void обычно не тестируются, но в этом есть некоторая дополнительная логика, которую следует протестировать.
Комментарии:
1. Вызов этого метода, похоже, не имеет никаких побочных эффектов. Он задает переменную, но эта переменная не используется. Какое видимое поведение вам нужно протестировать?
2. @Joni изменил вопрос
3. В методах инициализации, похоже, отсутствует закрывающая скобка. Можете ли вы исправить форматирование? Также: если вы объясните словами в вопросе, что должен делать класс, это может послужить руководством при разработке тестовых примеров для этого класса.
Ответ №1:
Я знаю, что методы void обычно не тестируются
Это… неверно.
Создайте средство получения для этого link
поля. Вы можете сделать его закрытым для пакета (вообще без модификатора доступа), если хотите, или даже задокументировать его с помощью @ForTesting
. Теперь вы можете проверить, что ваш метод изменяет link по желанию (и если это ваш реальный код, тест завершится неудачей; вы вообще не меняете path; добавление пустой строки к строке, подобной этой, ее не меняет. Если path
значение не равно null, в этом случае указатель null заменяется указателем на строку "null"
. Который.. кажется странным.
ПРИМЕЧАНИЕ: Не используйте StringUtils. Это плохо.
Например, StringUtils.isNotBlank
имеет массу проблем:
- ‘not’ в именах методов — это плохо; !StringUtils.isBlank() был бы более читабельным.
- Это неправильно; он ответит ‘false’, если вы передадите значение null, а это неверно. null — это не какой-то альтернативный подход к понятию пустой строки.
null
означает что-то вроде «нет значения» или «неизвестно». Если я спрошу вас: «У меня неизвестная рубашка. Он красный?», тогда единственным разумным ответом было бы: «Эм? Я не знаю!». Ни «Да, это красный», ни «Нет, это не так» не являются правильными. - В Java это уже есть! Просто позвони
path.isBlank()
. Или, скорее,!path.isBlank()
.
Ответ №2:
методы void могут быть протестированы
- Если у них есть какой-либо объект в качестве параметра, после вызова метода эти параметры могут быть утверждены
- Если методы выбрасывают какие-либо исключения, мы можем утверждать, выбрасывает ли метод исключения или нет
Демонстрационный класс
public class Demo
{
private String path="dummy";
private static final String CONTENTPATH="/content";
private String link;
protected void init()
{
if(path.length()>0)
{
link=path "";
}
}
private boolean isInternal()
{
return path.contains(CONTENTPATH);
}
public String getLink()
{
return link;
}
}
Тестовый пример
class DemoTest {
@Test
void test() {
Demo obj = new Demo();
obj.init();
assertEquals("dummy", obj.getLink());
}
}
Комментарии:
1. как выполняется условие StringUtils. isNotBlank(path) amp;amp; isInternal() … разве это не должно быть протестировано
2. если у нас есть параметр для поля «path», то мы можем установить empty для одного случая и non empty для другого случая, а затем мы можем выполнить утверждение