首页 文章

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

提问于
浏览
5

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

但是,当我尝试测试 java.net.InetAddress 类时,如果提供数据点的方法包含抛出异常的代码(在本例中为 UnknownHostException ),我遇到了一个特殊问题:

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

  • 将方法声明为抛出相应的异常:
@DataPoints
public static InetAddress[] declareException() throws UnknownHostException {
    return new InetAddress[] {
        InetAddress.getByName("not a valid internet address")
    };
}
  • 显式捕获异常并重新抛出 AssertionError
@DataPoints
public static InetAddress[] rethrowAsAssertionError() {
    try {
        return new InetAddress[] {
            InetAddress.getByName("not a valid internet address")
        };
    } catch(UnknownHostException ex) {
        throw new AssertionError(ex);
    }
}

在这两种情况下,都会使用无用的消息"Never found parameters that satisfied method assumptions. Violated assumptions: []"抛出 AssertionError ,这与首先没有 @DataPoints 注释的方法相同 .

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

2 回答

  • 0

    这是一个已知问题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,但目前仍在讨论中,尚未被接受 .

  • 8

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

    enter image description here

相关问题