如何将 Mono 错误与 Java 中的字符串进行比较

How to compare Mono error to a String in Java

我有一个类似这样的方法:

public Mono<SomeDTO> DoAction(SomeDTO someDTOObject) {
        return findUser(someDTOObject.getUsername())
                .flatMap(existingUser -> {
                    Update update = new Update();
                   
                    return mongoTemplate.upsert(
                            Query.query(Criteria.where("username").is(someDTOObject.getUsername())),
                            update,
                            SomeDTO.class,
                            COLLECTION_NAME);                            

                }).switchIfEmpty(
                        Mono.defer(() -> {
                            return Mono.error(new Exception("User Name doesn't exist."));
                        })
                );
    }

为此,我编写了一个这样的测试用例来测试异常:

@Test
    public void DoAction_TestException() {
        SomeDTO someDTOObject = databaseUtil.SomeDTOMock;        

        Query query = Query.query(Criteria.where("username").regex("^"+userId+"$","i"));
        doReturn(Mono.empty()).when(mongoTemplate).findOne(query,
                SomeDTO.class, "COLLECTION_NAME");
        try {
            SomeDTO someDTOObjectResult = mongoImpl.DoAction(someDTOObject).block();
        }
        catch (Exception e) {
            String expected = "User Name doesn't exist.";
            String result = e.getMessage().toString();   ///////  this value during debugging is "java.lang.Exception:User Name doesn't exist. "
            assertEquals(expected,result);
        }
       
    }

当我运行上面的代码时,断言失败,因为变量结果有额外的字符串。如何从结果中删除 java.lang.Exception?
我不想使用任何字符串函数来删除部分 string.ANy 帮助会很有帮助。

如果您已经在 catch 子句中,那么您就不再与 Mono 打交道了。

在调试中您正在检查 e.toString(),这将是 "java.lang.Exception:User Name doesn't exist. "

但尝试以更孤立的方式检查行为。

public static void main(String[] args) {
        Exception exception = new Exception("User Name doesn't exist.");
        try {
            throw exception;
        } catch (Exception e) {
            System.out.println("getMessage: " +e.getMessage());
            System.out.println("toString: " + e.toString());
        }
    }

在这种情况下 e.getMessage() 将按预期打印 User Name doesn't exist.

Eugene 的回答已经向您展示了正确的方法。

备用解决方案 #1:

创建一个特定的异常 class:EntityNotFoundException extends IOExceptionUsernameNotFoundException extends IOException 并测试您的结果是否是 class.

的一个实例

备选方案#2:

将您期望的字符串预期扩展为您真正得到的字符串。

备选方案 #3:

(我不知道 Mono,所以 IF:) 如果 Mono 将 Exception 包装成另一个异常,你可能可以通过使用 e.getCause 到达原始异常: 将行 String result = e.getMessage().toString(); 更改为 String result = e.getCause().getMessage();.

为了帮助我们找出这一点,只需在行 String expected = "User Name doesn't exist."; 之后添加行 e.printStackTrace();,然后向我们显示打印的错误消息。如果其他解决方案还没有帮助,我们可以从那里进一步提供帮助。