使用参数化的跑步者在JUnit 4超时时添加更多信息

时间:2012-12-23 18:35:32

标签: java unit-testing junit junit4 parameterized-unit-test

我正在使用@RunWith(value = Parameterized.class)运行JUnit 4测试。这很好,没有问题。但是,当我的34个测试中的任何一个超时时,我只收到消息java.lang.Exception: test timed out after 15000 milliseconds。我希望它也显示测试的参数。

我甚至试图像下面的代码一样(我知道这对于大多数情况来说是一个可怕的解决方案,我只是想看看我是否可以在任何时间显示消息),但这不起作用,它仍然产生了上述信息。

private String parameter;

@Test(timeout = 15000)
public void solveAll() {
    try {
        // ... do something that might take a long time
    }
    catch (Throwable e) {
        Assert.fail(this.parameter + " failed! Because of " + e.getMessage());
    }
}

当测试结果超时时,如何让JUnit也显示this.parameter

这是一个非常简单的示例测试类,它显示了这个问题:

public class ShowMyMessageTest {
    @Test(timeout=1000)
    public void test() {
        try {
            Thread.sleep(3000);
        }
        catch (Throwable e) {
            Assert.fail("Timeout reached with value 42");
        }
    }
}

使用这个ShowMyMessageTest我有时会得到预期的“超时达到值42”,有时我只得到“java.lang.Exception:1000毫秒后测试超时”。在这种情况下,我希望始终获得“Timeout达到值42”。

1 个答案:

答案 0 :(得分:5)

这有点像黑客,但您可以使用@After来检查参数的状态:

@RunWith(Parameterized.class) public class FooTest {
  private boolean flag = true;
  private String param;

  public FooTest(String param) {
    this.param = param;
  }

  @Test(timeout = 1000) public void test() {
    while(true == flag);
    param = null;
  }

  @After public void after() {
    Assert.assertNull("Problem:" + param, param);
  }

  @Parameters public static Collection<Object[]> params() {
    Object[][] params = { { "foo" } };
    return Arrays.asList(params);
  }
}

另一种方法是编写自己的runner