【问题标题】:How to notify JUnit of exceptions generated in @DataPoints annotated methods?如何通知 JUnit @DataPoints 注释方法中产生的异常?
【发布时间】:2011-11-17 11:58:27
【问题描述】:

我使用 JUnit 的实验性 @Theory 注释为 hashCodeequals 方法实现了通用测试。测试用例类本身基于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);
        }
    }
    

在这两种情况下,AssertionError 都会抛出无用的消息 “从未找到满足方法假设的参数。违反假设:[]”,这与没有 @987654331 相同首先是@注解的方法。

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

【问题讨论】:

  • 为什么你的数据点生成器会抛出异常?您不应该以始终生成有效数据的方式编写它吗?
  • 理想情况下,是的,但是 (a) 没有人是完美的,所以我不想仅仅吞下选中的 UnknownHostException,并且 (b) 我可以想到用例(例如,使用实时数据库/网络服务器 ...)即使在正确的代码上也可能引发异常。因此需要一种机制来通知用户发生了异常。
  • (a) 所以在你的测试中发现错误需要更长的时间,它仍然应该被修复。 (b) 听起来你不再谈论测试了。充其量,您是在进行集成测试而不是单元测试。但如果是这种情况,那么我认为您没有按照预期的方式使用@DataPoints。数据应该是应该产生确定性结果的值,而不是您正在测试的代码的函数。
  • @unholysampler re (b) 我可以设想一个场景,其中数据库将提供测试数据,但我会达到,并且我的特殊情况涉及场景 (a)。是的,这个错误应该被修复,我不主张它不应该,但测试代码和工具也应该尽可能简单。马修的回答正好提供了这一点。它确实提醒我注意数据点生成器中的错误。

标签: java unit-testing junit junit4


【解决方案1】:

这是一个已知问题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 指出这是一个有待解决的已知问题。
猜你喜欢
  • 1970-01-01
  • 2016-03-17
  • 2012-10-01
  • 1970-01-01
  • 2011-01-29
  • 2021-09-27
  • 1970-01-01
  • 2010-11-27
  • 2018-07-28
相关资源
最近更新 更多