如何解决“参数不同”错误 - 单元测试

我想用 mockito为我的addTask方法编写单元测试。这是包含此方法的类。


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);

}

}


千巷猫影
浏览 211回答 2
2回答

慕姐4208626

在您的测试用例中,您试图验证对此方法的调用: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您的测试调用时为null 。因此,如果您不需要/想要测试是否提供了正确的用户,addTask那么只需将您的验证调用更改为: verify(taskActionsMock).addTask(taskName,null)但是,这感觉像是一种回避,因此您应该确保它connectedUser不为空,并且是您在测试用例中提供给 verify 调用的值。

缥缈止盈

您的verify方法指定您希望addTask使用特定对象taskName和user对象进行调用。verify(taskActionsMock).addTask(taskName,user);但是由于您的连接用户是null这种期望失败了。如果您不关心连接的用户,您可以使用匹配器告诉 Mockito 忽略其实际值。例如verify(taskActionsMock).addTask(ArgumentMatchers.eq(taskName), ArgumentMatchers.any());或者,如果您确实关心用户,只需将您的 ToDoEngine 设置为连接用户即可。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java