Junit 4 ExpectedException.expectMessage应该无法通过测试,并且它没有

时间:2017-04-16 13:29:34

标签: java exception junit java-8

我有以下课程:

public class MyClassTest {
@Rule
public ExpectedException thrown = ExpectedException.none();

@Test
public void testMyMethod() throws Exception {
    // Test 1
    String[] args = ...;
    MyClass.myMethod(args);

    // Test 2
    thrown.expect(InvalidParamException.class);
    thrown.expectMessage("exceptionString 1");
    args = ...;
    MyClass.myMethod(args);

    // test 3
    thrown.expect(InvalidParamException.class);
    thrown.expectMessage("exceptionString 2");
    args = ...;
    MyClass.myMethod(args);
}

问题是测试2中的expectMessage是假的,为了讨论,实际的预期消息是exceptionString 3,但测试并没有失败,尽管预期的消息与实际消息不同。 它变得更奇怪 - 如果我向expectMessage提供一个乱码消息,例如" fdsfsdfsdfsdfsdfsdthe" - 然后测试失败了:

java.lang.AssertionError: 预期:( InvalidParamException和异常的实例,消息包含" fdsfsdfsdfsdfsdfsdthe")      但是:带有消息的异常包含" fdsfsdfsdfsdfsdfsdthe"消息是" exceptionMessage3"

这就是预期的行为 - 但是当我更改exceptionMessage3只是一点点,一两个字母,甚至发送一个空字符串时 - 测试根本不会失败。

我错过了什么吗?

1 个答案:

答案 0 :(得分:5)

ExpectedException只能容纳1个预期的例外。

你不能像这样重用它。之一:

  1. 将您的测试用例分成3个独立的测试用例;
  2. 有3个ExpectedException个实例;
  3. 使用普通的try / catch;
  4. 如果您使用的是最新版本的Java(8+)和支持它的JUnit,请使用assertThrows(或expectThrows)。