如何将 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 IOException
或 UsernameNotFoundException 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();
,然后向我们显示打印的错误消息。如果其他解决方案还没有帮助,我们可以从那里进一步提供帮助。
我有一个类似这样的方法:
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 IOException
或 UsernameNotFoundException 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();
,然后向我们显示打印的错误消息。如果其他解决方案还没有帮助,我们可以从那里进一步提供帮助。