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

延迟引发的异常以添加软断言

谭新知
2023-03-14
    null

即使抛出异常,也可以观察到(并测试)一些副作用。我的示例测试代码如下:

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();

从抛出的异常中创建另一个软断言的最佳方法是什么?使用原始TestNG API,我可以简单地编写

softly.fail(ioe.toString(), ioe);

但是AssertJ似乎没有提供任何类似的东西。到目前为止,我的最佳选择是向catch块添加如下所示的smth:

softly.assertThat(true).as(ioe.toString()).isFalse();

如何使正在测试的代码引发的异常显示为结果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个答案

仇飞鹏
2023-03-14

对于问题1,Xaero的建议很有效。

但是,为了解决这两个问题,可以尝试使用catchthrowablefail(String failureMessage,Throwable realCause)(或者软断言)。

如果捕获了一个nonnull throwable(这意味着测试中的代码确实引发了异常),则可以使用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();
}

上面的代码让我有点不舒服,因为它测试两个不同的场景,一个是抛出异常,另一个是没有异常。创建两个测试用例可能是个好主意,这将简化测试和断言部分(我相信)。

不管怎样,希望能有所帮助!

 类似资料:
  • 我有一个基于Spring的webapp,我的问题是在代码更改后,我开始出现延迟加载异常。下面我详细描述了这种情况: 在开始的时候 我有一个账户和文字实体。一个帐户可以有多个单词,一个单词可以分配给多个帐户。 一个ccount.class 单词班 除了每个账户只能有一个“WordForToday”,它由账户中映射的单词实体表示。类如下: 一切都正常工作。特别是我有一个@Schedilly方法,每天调

  • 我需要做的是,当抛出异常时,我需要将处理延迟一段可配置的时间,比如15分钟。这将给服务器一些时间来稳定,而不是不必要地保持轮询。我正在使用骆驼的errorHandler机制,但它似乎不起作用。Camle不停地收到请求,没有任何延迟。请帮助解决这个问题。下面是束上下文快照:

  • 我有以下实体结构: 因此,我在每个实体类的顶部定义了以下命名实体图,这样我就可以优化我的查询,以确定我需要走多远: 路线: 停止: 孩子: 联系人: 我在我的仓库类中使用它们: 然而,我看不到正在进行任何连接查询,当我试图访问stops的子级时,会抛出一个lazyinit异常。我的理解是,这就是如何使用实体图来优化查询(例如,当我必须为每个单独的站点取子对象时,n 1问题),但我没有运气让它工作。

  • 我想测试一个特定的方法是否可以毫无例外地处理一组字符串。因此,我想使用AssertJ的软断言,比如: 不幸的是,我必须坚持使用AssertJ 1。x分别是Java 6,所以我不能利用这一点: 有没有办法用AssertJ(或JUnit)做到这一点?

  • 问题内容: 我有一个div“框”,当用户滚动到下一页时,它会逐渐使用“ .fp-viewing”作为锚点淡入淡出以开始过渡效果。问题是,当触发.fp- viewing时,页面开始滚动,并且在动画结束之前将框滚动出视图。 触发.fp-viewing时,如何延迟滚动开始,直到box在4s内完成动画播放? 问题答案: 您可以使用fullpage.js提供的选项来取消运动。

  • 我这里少了点什么。我做错什么了吗?