Java 延迟引发的异常以添加软断言
考虑到我有一个测试的方法Java 延迟引发的异常以添加软断言,java,unit-testing,assertj,Java,Unit Testing,Assertj,考虑到我有一个测试的方法 可能有副作用(如在文件系统上创建的文件),以及 可能引发异常 即使抛出异常,也可以观察(并测试)某些副作用。我的示例测试代码如下: final SoftAssertions softly = new SoftAssertions(); try { /* * May throw an exception */ doSmth(); } catch (final IOException ioe) { /* * Ho
- 可能有副作用(如在文件系统上创建的文件),以及
- 可能引发异常
final SoftAssertions softly = new SoftAssertions();
try {
/*
* May throw an exception
*/
doSmth();
} catch (final IOException ioe) {
/*
* How do I add a soft assertion wrapping an exception?
*/
}
/*
* Testing for side effects.
*/
softly.assertThat(...).as("%s exit code", ...).isEqualTo(0);
softly.assertThat(...).as("the number of downloaded files").isEqualTo(3);
softly.assertThat(...).as("this should be true").isTrue();
softly.assertThat(...).as("and this should be true, too").isTrue();
softly.assertAll();
问题1
用抛出的异常创建另一个软断言的最佳方法是什么?使用原始的TestNG API,我可以简单地编写
softly.fail(ioe.toString(), ioe);
但AssertJ似乎没有提供任何类似的服务。到目前为止,我最好的选择是像这样将smth添加到catch块:
softly.assertThat(true).as(ioe.toString()).isFalse();
还有更好的选择吗
问题2
如何使被测试代码引发的异常显示为结果AssertionError
的原因(或抑制的异常)?目前,我做了以下工作:
Throwable failure = null;
try {
doSmth();
} catch (final IOException ioe) {
failure = ioe;
}
try {
softly.assertAll();
} catch (final AssertionError ae) {
if (failure != null) {
if (ae.getCause() == null) {
ae.initCause(failure);
} else {
ae.addSuppressed(failure);
}
}
throw ae;
}
--但更优雅的版本更受欢迎。问题1:您可以使用:
softly.assertThatThrownBy(() -> doSmth())
.isInstanceOf(Exception.class)
.hasMessage("My Message");
问题1:您可以使用:
softly.assertThatThrownBy(() -> doSmth())
.isInstanceOf(Exception.class)
.hasMessage("My Message");
对于问题1,Xaero建议效果良好 但是,要解决这两个问题,请尝试使用联合使用(或) 如果捕获到一个非空的可抛出(这意味着测试中的代码确实抛出了一个异常),那么可以使用
fail
构建一个带有自定义错误消息的AssertionError
,并将捕获到的异常作为AssertionError
的原因传递
代码如下所示:
Throwable thrown = catchThrowable(() -> { doSmth(); });
if (thrown != null) {
softly.fail("boom!", thrown);
} else {
softly.assertThat(...).as("%s exit code", ...).isZero();
softly.assertThat(...).as("the number of downloaded files").isEqualTo(3);
softly.assertThat(...).as("this should be true").isTrue();
softly.assertThat(...).as("and this should be true, too").isTrue();
}
不过,上面的代码让我有点不舒服,因为它正在测试两种不同的场景,一种是抛出异常,另一种是没有异常。创建两个测试用例可能是一个好主意,这将简化测试和断言部分(我相信)
不管怎样,希望能有帮助
注:请注意,对于问题1,您可以使用
isZero()
而不是isqualto(0)
,Xaero建议效果良好
但是,要解决这两个问题,请尝试使用联合使用(或)
如果捕获到一个非空的可抛出(这意味着测试中的代码确实抛出了一个异常),那么可以使用fail
构建一个带有自定义错误消息的AssertionError
,并将捕获到的异常作为AssertionError
的原因传递
代码如下所示:
Throwable thrown = catchThrowable(() -> { doSmth(); });
if (thrown != null) {
softly.fail("boom!", thrown);
} else {
softly.assertThat(...).as("%s exit code", ...).isZero();
softly.assertThat(...).as("the number of downloaded files").isEqualTo(3);
softly.assertThat(...).as("this should be true").isTrue();
softly.assertThat(...).as("and this should be true, too").isTrue();
}
不过,上面的代码让我有点不舒服,因为它正在测试两种不同的场景,一种是抛出异常,另一种是没有异常。创建两个测试用例可能是一个好主意,这将简化测试和断言部分(我相信)
不管怎样,希望能有帮助
注意,您可以使用
isZero()
而不是isqualto(0)
谢谢。规则。第一个问题,如果抛出异常,我希望我的软断言最终失败,因此软断言认为code(()->doSmth()).doethrowanyexception()更合适。规则。第二个问题——我想处理的不是最初失败的原因,而是从software.assertAll()抛出的最后一个AssertionError
代码>。很抱歉,我没有这个问题的答案,但似乎因为你问了两个不同的问题,他们也应该问两个不同的SO问题。因为第二个问题的标题更能说明您的问题,所以它可能更符合您的目的。也许您可以尝试将您的软断言实例设置为间谍对象,然后您可以像模拟一样操纵返回值。谢谢。规则。第一个问题,如果抛出异常,我希望我的软断言最终失败,因此软断言认为code(()->doSmth()).doethrowanyexception()更合适。规则。第二个问题——我想处理的不是最初失败的原因,而是从software.assertAll()抛出的最后一个AssertionError
代码>。很抱歉,我没有这个问题的答案,但似乎因为你问了两个不同的问题,他们也应该问两个不同的SO问题。因为第二个问题的标题更能说明您的问题,所以它可能更符合您的目的。也许您可以尝试将您的软断言实例设置为间谍对象,然后您可以像模拟一样操纵返回值。我与您一样关注双重测试场景。这就是为什么我不能为第二个场景提供一个我满意的答案,因为在实际测试的内容和所讨论的主题(如果有意义的话)之间有太多的偏差。我和你一样关注双重测试场景。这就是为什么我不能为第二个场景提供一个我满意的答案,因为在实际测试的内容和问题主题之间有太多的偏差(如果这有意义的话)。