как a может написать тестовый пример для этого метода void?

#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 имеет массу проблем:

  1. ‘not’ в именах методов — это плохо; !StringUtils.isBlank() был бы более читабельным.
  2. Это неправильно; он ответит ‘false’, если вы передадите значение null, а это неверно. null — это не какой-то альтернативный подход к понятию пустой строки. null означает что-то вроде «нет значения» или «неизвестно». Если я спрошу вас: «У меня неизвестная рубашка. Он красный?», тогда единственным разумным ответом было бы: «Эм? Я не знаю!». Ни «Да, это красный», ни «Нет, это не так» не являются правильными.
  3. В Java это уже есть! Просто позвони path.isBlank() . Или, скорее, !path.isBlank() .

Ответ №2:

методы void могут быть протестированы

  1. Если у них есть какой-либо объект в качестве параметра, после вызова метода эти параметры могут быть утверждены
  2. Если методы выбрасывают какие-либо исключения, мы можем утверждать, выбрасывает ли метод исключения или нет

Демонстрационный класс

 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 для другого случая, а затем мы можем выполнить утверждение