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

Java 如何通知JUnit在@DataPoints注释方法中生成的异常?,java,unit-testing,junit,junit4,Java,Unit Testing,Junit,Junit4,我使用JUnit的实验性@Theory注释为hashCode和equals方法实现了一个通用测试。测试用例类本身是基于 但是,当我尝试测试java.net.InetAddress类时,如果提供数据点的方法包含引发异常的代码(在本例中为未知后异常),我遇到了一个特殊的问题: 因此,我尝试了两种选择,都导致了同样不令人满意的结果: 将该方法声明为引发适当的异常: @DataPoints public static InetAddress[] declareException() throws Unk

我使用JUnit的实验性
@Theory
注释为
hashCode
equals
方法实现了一个通用测试。测试用例类本身是基于

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

因此,我尝试了两种选择,都导致了同样不令人满意的结果:

  • 将该方法声明为引发适当的异常:

    @DataPoints
    public static InetAddress[] declareException() throws UnknownHostException {
        return new InetAddress[] {
            InetAddress.getByName("not a valid internet address")
        };
    }
    
  • 显式捕获异常并作为断言错误重新抛出:

    @DataPoints
    public static InetAddress[] rethrowAsAssertionError() {
        try {
            return new InetAddress[] {
                InetAddress.getByName("not a valid internet address")
            };
        } catch(UnknownHostException ex) {
            throw new AssertionError(ex);
        }
    }
    
  • 在这两种情况下,都会抛出一个
    AssertionError
    ,其中包含一条没有帮助的消息“从未找到满足方法假设的参数。违反的假设:[]”,这与首先没有带
    @DataPoints
    注释的方法相同

    是否有人知道是否有办法将异常传播到JUnit(最终是用户),或者这是JUnit中的一个bug?

    这是一个已知的问题

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

    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;
    }
    
    这应该行得通


    有一个挂起的拉取请求,但目前仍在讨论中,尚未被接受。

    为什么数据点生成器会引发异常?您不应该以一种总是生成有效数据的方式编写它吗?理想情况下,是的,但是(a)没有人是完美的,所以我不想简单地接受选中的
    未知后异常,并且(b)我可以想到即使在正确的代码上也可以抛出异常的用例(例如,使用实时数据库/Web服务器…)。因此,需要一种机制来通知用户异常已经发生。(a)因此,在测试中发现错误需要更长的时间,它仍然应该得到修复。(b) 听起来你不再谈论测试了。充其量,您正在进行集成测试,而不是单元测试。但是如果是这样的话,那么我认为您没有按照预期的方式使用
    @DataPoints
    。数据应该是产生确定性结果的值,而不是您正在测试的代码的函数。@Unholy Sampler re(b)我可能会设想一个场景,其中数据库将提供测试数据,但我会达到,我的特殊情况涉及场景(a)。是的,这个bug应该被修复,我并不主张它不应该被修复,但是测试代码和工具也应该使它尽可能的简单。马修的回答正好提供了这一点。它确实提醒了我数据点生成器中的错误。这正是我要找的,谢谢。另外,+1指出这是一个已知问题,有待解决。