如何通知JUnit在@DataPoints注释方法中生成的异常?

时间:2011-11-17 11:58:28

标签: java unit-testing junit junit4

我使用JUnit的实验hashCode注释为equals@Theory方法实现了通用测试。测试用例类本身基于dfa's version

然而,当我尝试测试java.net.InetAddress类时,如果提供数据点的方法包含抛出异常的代码(在这种情况下是UnknownHostException),我遇到了一个特殊的问题):

所以我尝试了两种方法,这两种方法都导致了同样令人不满意的结果:

  1. 将方法声明为抛出相应的异常:

    @DataPoints
    public static InetAddress[] declareException() throws UnknownHostException {
        return new InetAddress[] {
            InetAddress.getByName("not a valid internet address")
        };
    }
    
  2. 明确捕获异常并重新抛出AssertionError

    @DataPoints
    public static InetAddress[] rethrowAsAssertionError() {
        try {
            return new InetAddress[] {
                InetAddress.getByName("not a valid internet address")
            };
        } catch(UnknownHostException ex) {
            throw new AssertionError(ex);
        }
    }
    
  3. 在这两种情况下,AssertionError抛出无用的消息“从未找到满足方法假设的参数。违反假设:[]”,这与没有首先是@DataPoints注释方法。

    有没有人知道是否有办法将异常传播给JUnit(最终是用户)或者这是JUnit中的错误?

2 个答案:

答案 0 :(得分:8)

这是一个已知问题137: Exceptions hidden in DataPoints methods

解决方法是在@BeforeClass中创建数据点,然后从DataPoints中使用它:

private static InetAddress[] datapoints;

@BeforeClass
public static void generateData() throws UnknownHostException {
  // do all the work of generating the datapoints
  datapoints = new InetAddress[] {
    InetAddress.getByName("not a valid internet address")
  };
}

@DataPoints
public static InetAddress[] data() {
  return datapoints;
}

这应该有用。

有待处理的提款请求328: @DataPoints-related fixes,但目前仍在讨论中,尚未被接受。

答案 1 :(得分:0)

这是一个众所周知的问题。但是,我发现了一个更简单的解决方只需重命名数据方法。不要从DataPoints返回原始变量。为了确认,我附上了我的截图。

enter image description here