当前位置: 首页 > 知识库问答 >
问题:

如何在lambda单元测试异常抛出?

丰博
2023-03-14

我有一个方法:

    public UserEntity authentication(final UserEntity auth)
        throws AuthenticationException, EmailNotFoundException {
        final AtomicReference<UserEntity> atomic = new AtomicReference<>();
        this.repository
            .findByEmail(auth.getEmail())
            .ifPresentOrElse(
                usr -> {
                    if (Objects.equals(usr.getPassword(), auth.getPassword())) {
                        atomic.set(usr);
                    } else {
                        throw new AuthenticationException();
                    }
                },
                () -> {
                    throw new EmailNotFoundException(auth.getEmail());
                }
            );
        return atomic.get();
    }

这是用户授权测试的样子:

    @Test
    void userAuthentication_success() {
        given(this.repository.findByEmail(this.user.getEmail()))
            .willReturn(Optional.of(this.user));
        assertThat(this.underTest.authentication(this.user))
            .isInstanceOf(UserEntity.class)
            .isEqualTo(this.user);
        verify(this.repository)
            .findByEmail(this.user.getEmail());
    }

有没有办法检查用户输入错误密码的情况?因为在我发送错误密码的情况下,它不起作用,因为给定(这个存储库)会返回(可选(这个用户)); 使存储库.findByEmail()在你检查密码之前返回结果。

共有1个答案

罗翔
2023-03-14

首先,我会重构你的代码以避免副作用:

public UserEntity authentication(final UserEntity auth)
    throws AuthenticationException, EmailNotFoundException {
    return this.repository
        .findByEmail(auth.getEmail())
        .map(usr -> {
           if (!Objects.equals(usr.getPassword(), auth.getPassword())) {
               throw new AuthenticationException();
           }
           return usr;
        }).orElseThrow(() -> { throw new EmailNotFoundException(auth.getEmail()); });
}

然后,我看不出模仿< code > this . repository . findbyemail 有什么问题,我只是认为您让它返回了一个具有正确密码的有效用户。类似于:

given(this.repository.findByEmail(this.user.getEmail())).willReturn(Optional.of(this.user.withPassword("wrong password")));
 类似资料:
  • 问题内容: 如您所知,异常情况下会引发异常。那么如何模拟这些异常呢?我觉得这是挑战。对于此类代码段: 有人有好主意吗? 问题答案: 其他答案已经解决了如何编写用于检查是否引发异常的单元测试的一般问题。但是我认为您的问题实际上是在询问如何获取代码以首先引发异常。 以您的代码为例。在简单的单元测试的环境中,很难在内部引发异常。问题是,为了使异常发生,代码(通常)需要在网络中断的计算机上运行。安排在单元

  • 我用Spock测试Java代码。我测试这段代码: 我写了一个测试: 它失败是因为抛出了另一个CustomException。但是在块中,我捕获这个异常并抛出一个,因此我希望我的方法将抛出,而不是。如何测试它?

  • 我想测试一些错误处理逻辑,所以我想在我的单元测试中模拟特定的异常类型。我正在嘲笑对boto3的调用,但是我想让这个mock引发一个异常。我正在测试的代码遵循以下模式: 我已经创建了一个unittest模拟,但我不知道如何使它引发异常,因为这个参数NotFound exception。我尝试了以下方法,但不起作用,因为在计算except子句时,它得到了“exceptions必须派生自基类”: 如何在

  • 问题 你想写个测试用例来准确的判断某个异常是否被抛出。 解决方案 对于异常的测试可使用 assertRaises() 方法。 例如,如果你想测试某个函数抛出了 ValueError 异常,像下面这样写: import unittest # A simple function to illustrate def parse_int(s): return int(s) class Test

  • 我正在处理一些代码,需要测试函数抛出的异常类型(是TypeError、ReferenceError等吗?)。 我当前的测试框架是AVA,我可以将其作为第二个参数方法进行测试,如下所示: 我开始用笑话重写我的测试,但找不到如何轻松做到这一点。这有可能吗?

  • 我知道一种方法是: 有什么更干净的方法吗?(可能使用JUnit的?)