Как решить "аргументы разные" ошибка - модульное тестирование - PullRequest
0 голосов
/ 06 сентября 2018

Я хотел написать модульный тест для моего addTask метода с mockito. Вот класс, который содержит этот метод.

package controller;

import model.Task;
import model.User;
import repository.TaskActions;
import repository.UserActions;

import java.sql.SQLException;
import java.util.List;

public class ToDoEngine {
private TaskActions taskActions;
private UserActions userActions;
private User connectedUser;

public ToDoEngine(UserActions userStorage, TaskActions taskStorage) {
    this.taskActions = taskStorage;
    this.userActions = userStorage;
}

public boolean signIn(String username, String password) throws SQLException {
    connectedUser = new User(username, password);
    if (!userActions.signIn(connectedUser)) {
        return false;
    }
    connectedUser.setID(retrieveConnectedUserID(connectedUser));
    return true;
}

private int retrieveConnectedUserID(User connectedUser) throws SQLException {
    return userActions.retrieveUserID(connectedUser);
}

public void addTask(String taskName) throws SQLException {
    taskActions.addTask(new Task(taskName), connectedUser);
}

}

Вот мои попытки. К сожалению, у меня есть ошибка. Ниже я собираюсь представить вам трассировку стека:

package controller;

import model.Task;
import model.User;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import repository.TaskActions;
import repository.UserActions;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

public class ToDoEngineTest {

@Mock
TaskActions taskActionsMock;
@Mock
UserActions userActionsMock;
private ToDoEngine toDoEngine;


@Before
public void setup() {
    MockitoAnnotations.initMocks(this);
    toDoEngine = new ToDoEngine(userActionsMock, taskActionsMock);
}

@Test
public void addTask() throws SQLException {
    Task taskName = new Task("wash");
    User user = new User("admin","123");
    toDoEngine.addTask("wash");
    verify(taskActionsMock).addTask(taskName,user);
}
}

StackTrace

Argument(s) are different! Wanted:
taskActionsMock.addTask(
    Task(taskName=wash),
    model.User@1b71f500
);
-> at controller.ToDoEngineTest.addTask(ToDoEngineTest.java:68)
Actual invocation has different arguments:
taskActionsMock.addTask(
    Task(taskName=wash),
    null
);
-> at controller.ToDoEngine.addTask(ToDoEngine.java:40)

Comparison Failure:  <Click to see difference>

Argument(s) are different! Wanted:
taskActionsMock.addTask(
    Task(taskName=wash),
    model.User@1b71f500
);
-> at controller.ToDoEngineTest.addTask(ToDoEngineTest.java:68)
Actual invocation has different arguments:
taskActionsMock.addTask(
    Task(taskName=wash),
    null
);
-> at controller.ToDoEngine.addTask(ToDoEngine.java:40)
at controller.ToDoEngineTest.addTask(ToDoEngineTest.java:68)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
...

Класс User и Task содержит hashCode и метод Equals.

Задача

package model;

import lombok.*;

@Getter
@Setter
@AllArgsConstructor
@ToString
@NoArgsConstructor
@EqualsAndHashCode
public class Task {
private String taskName;
}

Пользователь

package model;

import lombok.*;

@RequiredArgsConstructor
@Getter
@Setter
@EqualsAndHashCode

public class User {

private final String name;
private final String password;
private int ID;
}

Заранее спасибо за помощь. : D

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

В вашем тестовом примере вы пытаетесь проверить вызов этого метода:

public void addTask(String taskName) throws SQLException {
    taskActions.addTask(new Task(taskName), connectedUser);
}

С этим:

User user = new User("admin","123");
...
verify(taskActionsMock).addTask(taskName,user);

Сообщение об ошибке ...

Actual invocation has different arguments:
taskActionsMock.addTask(
    Task(taskName=wash),
    null
);

... говорит нам, что значение connectedUser в тестовом вызове равно null.

Глядя на ваш код, connectedUser член ToDoEngine заполняется вызовом метода signIn(), но ваш тестовый пример не вызывает этот метод и, следовательно, connectedUser равен нулю, когда addTask вызывается ваш тест.

Итак, если вам не нужно / хотите проверить, что правильный пользователь введен на addTask, тогда просто измените ваш проверочный вызов на: verify(taskActionsMock).addTask(taskName,null)

Однако это похоже на шаг в сторону, поэтому вместо этого вы должны убедиться, что connectedUser не равно нулю и является значением, которое вы указали для вызова проверки в вашем тестовом примере.

0 голосов
/ 06 сентября 2018

Ваш метод verify указывает, что вы ожидаете, что addTask будет вызываться с конкретными объектами taskName и user.

verify(taskActionsMock).addTask(taskName,user);

Но так как ваш подключенный пользователь - null, это ожидание не выполняется. Если вас не волнует подключенный пользователь, вы можете использовать средства сопоставления, чтобы сообщить Mockito, что он игнорирует его действительное значение. Е.Г.

verify(taskActionsMock).addTask(ArgumentMatchers.eq(taskName), ArgumentMatchers.any());

Или, если вы заботитесь о пользователе, просто настройте свой ToDoEngine, чтобы подключить пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...