为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

千巷猫影 2021-09-03 13:59:45
我想用 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 {@MockTaskActions taskActionsMock;@MockUserActions userActionsMock;private ToDoEngine toDoEngine;@Beforepublic void setup() {    MockitoAnnotations.initMocks(this);    toDoEngine = new ToDoEngine(userActionsMock, taskActionsMock);}@Testpublic void addTask() throws SQLException {    Task taskName = new Task("wash");    User user = new User("admin","123");    toDoEngine.addTask("wash");    verify(taskActionsMock).addTask(taskName,user);}}
查看完整描述

2 回答

?
慕姐4208626

TA贡献1852条经验 获得超7个赞

在您的测试用例中,您试图验证对此方法的调用:


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 调用的值。


查看完整回答
反对 回复 2021-09-03
?
缥缈止盈

TA贡献2041条经验 获得超4个赞

您的verify方法指定您希望addTask使用特定对象taskNameuser对象进行调用。

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

但是由于您的连接用户是null这种期望失败了。如果您不关心连接的用户,您可以使用匹配器告诉 Mockito 忽略其实际值。例如

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

或者,如果您确实关心用户,只需将您的 ToDoEngine 设置为连接用户即可。


查看完整回答
反对 回复 2021-09-03
  • 2 回答
  • 0 关注
  • 206 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信