我正在创建一个测试类,当我将模拟对象的某些方法存根以返回True时,当调用另一个判断已存根的方法时,其结果将被忽略.

以下是测试方法:

    @Test
    public void AddExistingUser(){
        //Mocking
        mockedManager = mock(UserManager.class);

        //Stubbing
        when(mockedManager.checkUsername("test")).thenReturn(true);
        
        assertThrows(IllegalArgumentException.class, () -> {
            mockedManager.addUser("test", "test");
        });
    }

这是UserManager.addUser:

    public void addUser(String username, String password) {
        //Check if the user already exists.
        if (checkUsername(username)) {
            throw new IllegalArgumentException("User already exists.");
        }
        usersData.put(username, hashPassword(password));
        file.writeString(json.toJson(usersData), false);
    }

这是UserManager.check Username,以防需要:

    public boolean checkUsername(String username) {
        return usersData.containsKey(username);
    }

(其中,usersData是一个对象映射字符串、字符串和gt;)

我预计测试会成功,因为它应该返回一个IllegalArgumentException,但是我得到了"org.opentest4j.AssertionFailedError:期望抛出java.lang.IllegalArgumentException,但没有抛出任何东西".

推荐答案

使用Mockito.mock,您将创建一个在任何方法中都没有逻辑、也没有实际方法调用的伪对象.

通过这一行,您告诉您模拟对象,当调用带有参数test的方法checkUsername时,它应该返回true.

when(mockedManager.checkUsername("test")).thenReturn(true);

使用类似于"foo"的其他参数调用checkUsername的任何其他调用都将返回由模拟指定的缺省值.由于此方法将返回boolean,因此应该返回false.

对于您的方法addUser(String, String),您还没有告诉moockito如何处理此方法.这意味着将不会有任何对此方法主体的调用.您也可以通过在您的方法的第一行中放置一些System.out.println来了解这一点.这些呼叫不会出现在任何日志(log)中.

如果您想让moockito调用您的实际方法,您有两个 Select :

1.告诉moockito调用真正的方法.这可以通过这两种形式中的任何一种来完成.

when(mockedManager.addUser("test", "test")).thenCallRealMethod();

doCallRealMethod().when(mockedManager).addUser("test", "test");

你只需要其中一张表格.这将导致每次调用带有参数"test", "test"的方法addUser时,它都会调用实际的方法.在任何其他情况下,它将执行默认行为,而不调用真正的方法.

2.使用Mockito.spy(Object.class).这样,您就不需要指定调用真正的方法,因为这是默认行为.您的类中要么需要一个无争议的构造函数,要么使用另一个构造函数创建模拟对象.此外,您还需要使用doXX个方法来执行moockito,这意味着您的模拟调用将如下所示.

doReturn(true).when(mockedManager).checkUsername("test");

Java相关问答推荐

在没有maven或IDE的情况下从命令行运行PFA模块化应用程序时出现神秘错误

取消按钮,但没有任何操作方法引发和异常

JUnit—如何模拟局部变量对象方法调用

使用标记时,场景大纲不在多个线程上运行

如何配置ActiveMQ Artemis以使用AMQP 1.0和其他协议与Java

现场观看Android Studio中的变化

如何打印本系列的第n项y=-(1)-(1+2)+(1+2+3)+(1+2+3+4)-(1+2+3+4+5)...Java中的(1+2+3+4...+n)

使用Spring Boot3.2和虚拟线程的并行服务调用

如何获取Instant#of EpochSecond(?)的最大值

是否为计划任务补偿系统睡眠?

如何在Jooq中获取临时表列引用?

如何创建模块信息类文件并将其添加到JAR中?

为什么StandardOpenOption.CREATE不能通过Ubuntu在中小企业上运行?

try 在两个不同数组的数字之间求平均值

Spring Framework6.1中引入的新RestClient是否有适合于测试的变体,就像RestTemplate和TestRestTemplate一样?

在Oracle db中,当我们提供字符串而不是数字时,比较是如何工作的?

AWS Java SDK v2.x中没有setObjectAcl方法

为了安全起见,有必要复制一份 list 吗?

在Java中将对象&转换为&q;HashMap(&Q)

如何判断元素计数并在流的中间抛出异常?