【发布时间】:2011-11-17 11:58:27
【问题描述】:
我使用 JUnit 的实验性 @Theory 注释为 hashCode 和 equals 方法实现了通用测试。测试用例类本身基于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); } }
在这两种情况下,AssertionError 都会抛出无用的消息 “从未找到满足方法假设的参数。违反假设:[]”,这与没有 @987654331 相同首先是@注解的方法。
有谁知道是否有办法将异常传播到 JUnit(最终传播到用户)或者这是 JUnit 中的错误?
【问题讨论】:
-
为什么你的数据点生成器会抛出异常?您不应该以始终生成有效数据的方式编写它吗?
-
理想情况下,是的,但是 (a) 没有人是完美的,所以我不想仅仅吞下选中的
UnknownHostException,并且 (b) 我可以想到用例(例如,使用实时数据库/网络服务器 ...)即使在正确的代码上也可能引发异常。因此需要一种机制来通知用户发生了异常。 -
(a) 所以在你的测试中发现错误需要更长的时间,它仍然应该被修复。 (b) 听起来你不再谈论测试了。充其量,您是在进行集成测试而不是单元测试。但如果是这种情况,那么我认为您没有按照预期的方式使用
@DataPoints。数据应该是应该产生确定性结果的值,而不是您正在测试的代码的函数。 -
@unholysampler re (b) 我可以设想一个场景,其中数据库将提供测试数据,但我会达到,并且我的特殊情况涉及场景 (a)。是的,这个错误应该被修复,我不主张它不应该,但测试代码和工具也应该尽可能简单。马修的回答正好提供了这一点。它确实提醒我注意数据点生成器中的错误。
标签: java unit-testing junit junit4