Java test with Mock Controller

218
21 декабря 2019, 06:20

У меня вопрос связанный с тестированием моего контроллера используя mock. В общем я создал проект используя MVC.

У меня есть класс Student у которого методы: setId, setName, setSubjects, getId, getName и getSubjects а также метод toString().

Вот мой View:

public class View {
private Student student;
private DiplomaStudent diplomaStudent;
public View() {
    this.student = new Student();
    this.diplomaStudent = new DiplomaStudent();
}
public void inoutStudent() {
    System.out.println("Enter id: ");
    Scanner input = new Scanner(System.in);
    Integer id = input.nextInt();
    student.setId(id);
    System.out.println("Enter name: ");
    Scanner inputName = new Scanner(System.in);
    String name = inputName.nextLine();
    student.setStudentName(name);
    System.out.println("Enter course");
    Scanner inputCourse = new Scanner(System.in);
    Integer course = inputCourse.nextInt();
    student.setCourse(course);
    System.out.println(student.getId() + " " + student.getStudentName() + " " + student.getCourse());
}
public String inputing() {
    System.out.println("Enter name: ");
    Scanner inputName = new Scanner(System.in);
    String name = inputName.nextLine();
    return name;
}
}

Вот мой Controller:

public class Controller {
private Student student;
private DiplomaStudent diplomaStudent;
private View view;
public Controller() {
    this.student = new Student();
    this.diplomaStudent = new DiplomaStudent();
    this.view = new View();
}
public void startStud() {
    view.inoutStudent();
}
public String inpt() {
    return view.inputing();
}
}

Проблема заключается в том что я пытаюсь протестировать Controller. Но я не знаю как это сдлеать, так как у меня ввод с клавиатуры. Я пытался протестировать View, но моя задача именно Controller протестировать и без тех классов которые я использовал в методе testView(). Подскажите как мне это сделать?

Вот тестирование класса view:

@Test
@DisplayName("test immitation from console input")
public void testView(){
    View view = new View();
    String inputName = "Jhon";
    InputStream in = new ByteArrayInputStream(inputName.getBytes());
    System.setIn(in);
    assertEquals("Jhon", view.inputing());
}
@Test
public void testController() {
    Controller controller = mock(Controller.class);
    //what i should write here
    assertEquals("Jhon", controller.startStud());
    assertEquals("Jhon", controller.inpt());
}
Answer 1

Сделайте конструктор

public Controller(Student student, DiplomaStudent diplomaStudent, View view) {
    this.student = student;
    this.diplomaStudent = diplomaStudent;
    this.view = view;
}

А затем "мокайте" входящие аргументы и тестируйте на здоровье

Для упрощения "мокирования" можете использовать библиотеку типа Mockito. В противном случае создайте классы унаследованные от этих типов и переопределите методы так чтобы вы могли проверить, что эти методы вызываются.

READ ALSO
Контекстное меню android не подключается

Контекстное меню android не подключается

пытаюсь подключить контекстное меню к элементам списка, но ничего не происходит, в чем может быть проблема?

230
Как получить самую частую гласную букву в строке

Как получить самую частую гласную букву в строке

Написал такой код, но с его помощью я получаю число повторений буквы в строке, как получить саму букву? никак не могу сообразить

208
Синхронизаниция по Integer в Java

Синхронизаниция по Integer в Java

Есть следующая учебная программка

191
Из активити не обновляется RecyclerView во фрагменте

Из активити не обновляется RecyclerView во фрагменте

При нажатии кнопки меню в MainActivity обновляются данные, изпользуемые в RecyclerViewСам рецайклер сидит во фрагменте, пытаюсь сообщить ему, что данные...

184