java: абстрагирование методов и их тестирование с помощью тестов JUnit

#java #junit

#java #junit

Вопрос:

новичок в java здесь:
итак, я реализовал небольшой тест JUnit, чтобы понять абстракцию методов в java через интерфейс.
Однако передача значений между методами и классами еще не работает полностью.
Мой тестовый набор — это класс, интерфейс и класс JUnit

  • реализация
    — Codetest.java
 package testing;
import org.junit.Test;

import static org.junit.Assert.assertEquals;

public class Codetest {
    Myinterface inter1 = new Class1("testing... ");

    @Test
    public void testPrintme(){
        assertEquals("testing... Teststring", inter1.printme());

        inter1.changeText("now its changed... ");

        assertEquals("now its changed... Teststring", inter1.printme());
    }

} 

— Class1.java

 package testing;

public class Class1 implements Myinterface {
    private String mystring;
    private String teststring;

    public Class1(String classtext){
        this.mystring = classtext;
    }
    public String printme(){
        //changeText(mystring);
        return mystring   teststring;
    }
    public void changeText(String changetext){
        teststring = "Teststring";
        this.teststring = teststring;
        this.mystring = changetext;
    }
}
 

— Myinterface.java

 package testing;

public interface Myinterface {
    // abstract methods
    public String printme();
    public void changeText(String changetext);

}
 
  • вывод
    org.junit.Ошибка сравнения:
    ожидается: тестирование…
    Фактическая строка теста: тестирование… null

teststring никогда не присваивается значение, потому что я не вызывал метод changeText в этой части теста
Что я пробовал
простой вызов changeText(mystring) (комментируется) внутри printme() в class1.java выполняет свою работу, но я думаю, что мог бы обойтись без этого, я ищу решение с помощью конструктора, вызываемого из codetest. Чего я здесь не вижу?
Любая помощь будет с благодарностью! извините за неправильный тип фрагмента кода.

Комментарии:

1. вы правы, теперь я это исправил

2. Почему вы не инициализируете teststring в конструкторе? Почему вы назначаете "Teststring" to teststring , а затем to this.teststring ? Почему это "Teststring" не константа, учитывая, что она принимает только одно значение?

3. return mystring teststring; -> teststring выполняется null во время первого вызова. Таким образом , методы возвращаются testing... null . Похоже, ваши модульные тесты работают просто отлично, потому что вы этого не ожидали и думали, что они будут вести себя по-другому. модульный тест точно показывает вам, где ваши предположения неверны и где находится ошибка в вашем коде.

4. @Polygnome спасибо за ваш комментарий, я понимаю результат теста, но я пока не могу получить значение teststring для передачи в ‘changeText’, а затем в метод ‘printme’ при первом вызове, без вызова ‘changeText’ внутри ‘printme’

5. Я повторю для @JustAnotherDeveloper инициализировать тестовую строку в конструкторе. И сделайте это окончательным. Нет необходимости инициализировать его где-либо еще.

Ответ №1:

Решаемая благодаря комментариям
Путем простой инициализации teststring в конструкторе

 public Class1(String classtext){
        this.mystring = classtext;
        teststring = "Teststring";
    }  
 

в Class1.java теперь тест работает просто отлично

  • вывод junit
    Процесс завершен с кодом выхода 0