Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 延迟引发的异常以添加软断言_Java_Unit Testing_Assertj - Fatal编程技术网

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问题。因为第二个问题的标题更能说明您的问题,所以它可能更符合您的目的。也许您可以尝试将您的软断言实例设置为间谍对象,然后您可以像模拟一样操纵返回值。我与您一样关注双重测试场景。这就是为什么我不能为第二个场景提供一个我满意的答案,因为在实际测试的内容和所讨论的主题(如果有意义的话)之间有太多的偏差。我和你一样关注双重测试场景。这就是为什么我不能为第二个场景提供一个我满意的答案,因为在实际测试的内容和问题主题之间有太多的偏差(如果这有意义的话)。