在参数化JUnit 4+测试中测试可选异常

时间:2011-09-01 20:04:46

标签: java unit-testing exception junit4 parameterized-unit-test

我正在尝试为一个方法编写单元测试,该方法将字符串作为一个参数 如果格式错误,则计量并抛出异常(如果可以,则为NONE)。 我想写一个参数化测试,它提供了几个字符串和 预期的异常(包括如果输入则不抛出的情况) 字符串格式正确!)。如果尝试使用@Test(expect = SomeException.class) 注释,我遇到了两个问题:

  1. 不允许expect = null。 那么我怎样才能测试抛出NO异常的预期结果 (对于结构良好的输入字符串)?

  2. 期待=不可能? 我还没试过,但我强烈怀疑这是事后的情况 读这个(请你说明这是否属实?): http://tech.groups.yahoo.com/group/junit/message/19383 这似乎是我发现的最佳解决方案。你有什么想法 它,特别是与之相比: How do I test exceptions in a parameterized test?

  3. 提前感谢您的任何帮助,我期待着讨论:)

3 个答案:

答案 0 :(得分:5)

创建两个测试用例类:

  • ValidStringsTest
  • InvalidStringsTest

显然,第一个测试各种有效输入(不抛出异常),而第二个总是期望异常。

请记住:测试的可读性比生产代码的可读性更重要。不要在JUnit测试用例中使用古怪的标志,条件和逻辑。朴素是国王。

另请参阅我的回答here,了解如何干净地测试异常。

答案 1 :(得分:1)

有两个不同的测试 - 一个用于有效输入,一个用于无效测试。我没有使用过JUnit 4所以我无法对准确的注释格式发表评论 - 但基本上你有一个参数化测试,其中包含各种不同的无效输入,这表明它 期待异常,以及使用各种不同有效输入的单独测试,但没有说明异常。如果在您的测试没有说它应该是的时候抛出异常,测试将失败。

答案 2 :(得分:0)

在许多情况下,将测试用例拆分为两个测试类是合适的方法 - 正如Tomasz和Jon已经概述的那样。

但是在其他情况下,这种分裂在可读性方面不是一个好的选择。假设测试数据集中的行具有自然顺序,并且如果按照这种自然顺序对行进行排序,则可以很容易地看出测试数据是否涵盖所有相关用例。如果将测试用例拆分为两个测试类,则不再能够轻松查看是否涵盖了所有相关测试用例。对于这些情况 How do I test exceptions in a parameterized test? 似乎确实提供了最好的解决方案。