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

如何使用jUnit 5断言来检查异常消息是否以字符串开头?[重复]

苏乐童
2023-03-14

我使用org。朱尼特。木星应用程序编程接口。断言抛出断言异常的对象:

Assertions.assertThrows(
        InvalidParameterException.class,
        () -> new ThrowingExceptionClass().doSomethingDangerous());

简而言之,抛出的异常在其消息中有一个变量部分dateTime

final String message = String.format("Either request is too old [dateTime=%s]", date);
new InvalidParameterException(message);

从版本I开始,我使用5.4.0断言提供了三种检查抛出异常的方法:

  • assertThrows (类

它们都没有提供一种机制来检查一个字符串是否以另一个字符串开头。最后两个方法只检查字符串是否相等。如何轻松检查异常消息是否以“任一请求太旧”开头,因为同一InvalidParameterException中可能会出现更多消息变化?

如果有一个方法assertThrows,我将不胜感激​(课堂)

Assertions.assertThrows(
    InvalidParameterException.class,
    () -> new ThrowingExceptionClass().doSomethingDangerous()
    message -> message.startsWith("Either request is too old"));

可悲的是,它并不存在。有解决办法吗?


共有2个答案

东方吕恭
2023-03-14

只有当异常消息是正在测试的单元的API的指定部分时,才应该测试异常消息文本的内容。但你是否应该这样做是值得怀疑的。

异常的消息文本通常不应该作为应用程序UI的一部分呈现给用户

指定消息文本的内容会鼓励API的客户端解析该消息文本,以了解有关异常情况的特定信息。这很棘手,容易出错,而且没有必要。在您的情况下,客户端可能会试图解析消息文本以提取date值。

相反,创建一个更具体地描述异常情况的自定义异常类型。在您的情况下,您希望自定义异常类扩展InvalidParameterException。自定义异常类可以有一个日期字段,以使附加数据可用。单元测试可以检查被测试的方法是否抛出了正确类型的异常,以及它是否有具有正确值的日期字段。

韩夕
2023-03-14

assertThrows()方法返回预期类型的异常实例(如果有)。然后,您可以手动从is获取消息,并检查它是否以您想要的字符串开头。

这是doc的一个样本

@Test
void exceptionTesting() {
    Exception exception = assertThrows(ArithmeticException.class, () ->
        calculator.divide(1, 0));
    assertEquals("/ by zero", exception.getMessage());
}
 类似资料:
  • 问题内容: 我想知道如何检查Python中字符串是否以“ hello”开头。 在Bash中,我通常这样做: 如何在Python中实现相同的目标? 问题答案: 有关的更多信息。

  • 问题内容: 我正在尝试检查字符串是否以开头。我该如何检查? 问题答案: 使用 substr 函数返回字符串的一部分。 如果您要确保它不是另一个协议。我会改用https,因为https也可以匹配,例如http-protocol.com。 一般而言:

  • 我想检查以开头的字符串是否正确。没有循环我怎么做?提前谢谢。

  • 问题内容: 我有以下if语句: 我希望它包含 等。使用字符串时是否有一种简单的方法?我试过了,但是没有用。 问题答案: 您的意思是: 或者您可以使用正则表达式:

  • 问题内容: 我有一个购物车,在下拉菜单中显示产品选项,如果它们选择“是”,我想使页面上的其他一些字段可见。 问题是购物车的文本中还包含价格修饰符,每个产品的价格修饰符可能不同。以下代码有效: 但是我宁愿使用这样的东西,它不起作用: 我只想在所选选项包含单词“是”的情况下执行操作,并且会忽略价格修饰符。 问题答案: 像这样: …或者您可以使用波浪号运算符: 之所以有效,是因为如果根本找不到该字符串,

  • 所以我应该创建一个方法来检查字符串是否包含任何数字。如果有,它将返回“yes”,如果没有,它将返回“no”。到目前为止,我认为我已经做了所有正确的事情,但不确定如何使用indexOf()搜索0-9之间的任何数字。请注意,我是javascript的初学者,所以我将感谢初学者友好的回复。