我应该使用带有断言的try-catch块

时间:2016-09-27 08:15:07

标签: java unit-testing try-catch assertions

这个问题记在很长一段时间了,我想知道是否应该使用带有断言的try-catch Block? 例如 -

select * from tablename where col1 LIKE 'value%'
union
select * from tablename where col2 LIKE 'value%'
...

什么是好习惯? 1还是2? TIA

2 个答案:

答案 0 :(得分:1)

不,你肯定不应该这样做。断言的目的是当它失败时,它会抛出断言错误,以便通知测试单元引擎。

所以,简单地说,做断言。让它工作:)。如果失败,你应该解决问题。

另一方面,如果要测试是否会抛出异常。您可以通过以下几种方式实现:

@Test(expected = NullPointerException.class)
public void myTestForException() {
    callMethodThatThrowsNullPointerException();
}

或者您可以使用try / catch:

@Test
public void myTest() {
    try {
        fail("Should throw whatever");
    } catch (MyException e) {
        // Everything is fine, test passed
    }
}

答案 1 :(得分:1)

使用JUnit或TestNG或类似的东西进行测试的关键在于,您可以在项目中进行数千次测试,并自动化测试。运行测试可以是构建过程的一部分,并且您可以获得有关已经过多少测试的反馈。当您的项目不仅包含少数几个类时,这绝对是必不可少的。

关于捕获assertEquals引发的错误并将其报告给控制台的想法并不是一个好主意。主要是因为当断言失败时,它会使测试传递 。这意味着无论您使用什么来运行测试(例如,Jenkins)都会报告错误的结果。例如,您将看到5000个测试中有5000个测试通过,即使其中很多测试都包含失败的断言。突然间,你的大套测试​​几乎没有价值。

此外,您仔细打印的堆栈跟踪将会在各种测试的大量输出中丢失。

所以简短的回答是你的想法(1)是正确的做法。这是每个人都做的。这意味着您的测试结果会得到恰当的报告。你永远不应该像你的想法那样编写测试(2)。