AssertJ assert on Exception 覆盖了另一个 Exception

AssertJ assert on Exception covered another Exception

我是 AssertJ 的初学者。我在使用 AssertJ 进行单元测试时遇到了一些问题。

我有如下源代码,捕获一个异常并抛出另一个异常。

try {
    Integer.valueOf(valueA);
} catch(Exception e) {
    throw new XXXException("value is not valid", e);
}

我下面的测试用例失败了,我被告知错误的异常断言,有点混乱。

Throwable thrown = catchThrowable(() -> {
    contract.init(ctx, "A", "100A", "B", "200");
});
assertThat(thrown).isInstanceOf(XXXException.class);

报错信息如下,看来是原来的异常被AssertJ捕获了。任何人都可以帮忙吗?这是错误还是我使用 AssertJ API 的错误?非常感谢。

java.lang.AssertionError: 
Expecting:
  <java.util.IllegalFormatConversionException: d != java.lang.String>
to be an instance of:
  <xxxx.XXXException>
but was:
  <"java.util.IllegalFormatConversionException: d != java.lang.String

这是我重现问题的尝试,测试按预期通过:

  @Test
  public void test() {
    Throwable thrown = catchThrowable(() -> f());
    assertThat(thrown).isInstanceOf(RuntimeException.class);
  }

  private void f() {
    try {
      Integer.valueOf("100A");
    } catch (Exception e) {
      throw new RuntimeException("value is not valid", e);
    }
  }

你能告诉我们 contract.init 在做什么吗?

另一种可能性是在堆栈跟踪中,如果它在某处包含一个 %d 堆栈跟踪,它可能会被 String.format 解释,但如果没有更多细节就很难说。