有没有办法验证在使用JUnit时是否在测试方法中调用try / catch指令的Catch部分?

时间:2015-06-03 12:40:34

标签: java unit-testing junit mockito

例如,如果我有以下要测试的类:

public class SomeClass{
    public void someMethod() {
        try {
            //Some code, where comething could go wrong
        } catch (Exception err) {
            //Handling it amounts to logging the problem and trying to continue
        }
    }
 }

如果我然后使用JUnit测试此方法,那么如果try子句中出现问题并且运行了catch代码,则测试将通过。

我想这样做,以便在运行catch子句指令时测试将失败。

我确实想到了一些我可以尝试编写测试的方法,以便我获得相同类型的功能,但是每个我都不希望以这种方式接近它的原因。如果达到任何catch子句似乎试图通过测试失败是最干净的方法,如果这实际上是可能的

备注:

我知道我可以验证代码的某些功能,并检查它们是否是某个值/已经使用Mockito多次运行。但是我想要一个解决方案,如果对测试方法进行了改变,从根本上改变了它的工作方式(但不是基本上执行了什么任务)那么我就不必重写测试。

不幸的是,为了使这个问题更加困难,我无法对源代码进行任何修改。这个位置是我无法控制的,所以我必须在这些范围内工作。

修改

SomeClass是我想测试的类。它不是实际的JUnit测试。我已经编辑了我的原始问题,试图澄清这一点。

5 个答案:

答案 0 :(得分:4)

我以前不得不处理这类问题。我最终嘲笑日志子系统(不是简单但不过分复杂)并听取了“有趣的”日志记录调用,然后在发生故障时标记失败。

答案 1 :(得分:2)

请记住,您正在测试此功能的行为。您的测试不应该关心(因此不测试)捕获异常,只是您想要的行为发生。

这意味着,如果您想测试某些内容是(或者没有)记录的话。然后你必须验证记录的事情。在我的几个应用程序中,我区分了调试日志记录和重要的logmessage。后者我们通过一个类发送(在我们的例子中,我们使用了Facade设计模式)。我们可以模拟(从而测试调用)。对于大多数应用程序,大多数开发人员日志记录不必进行测试,因此在这些情况下您应该忽略它。

答案 2 :(得分:0)

我不知道任何允许断言异常的框架在方法中被抛出和处理而不是传播。从问题描述中我会看到两种方法,都使用BDD:

  1. 不会调用catch块中的一行代码 - 记录器将是一个很好的选择,因为@Thirler建议
  2. 不会调用异常构造函数
  3. 两者都有问题:

    1. 不是很干净,因为它与正在执行的实际代码紧密耦合。
    2. 代码中处理的任何异常都会触发失败。
    3. 您可以尝试使用aspectj来检测代码并标记在执行 SomeClass.someMethod 时抛出了异常。

答案 3 :(得分:0)

一般来说,

-1-检查某个函数f()是否抛出异常

try {
  f();
  // notify test failure here
} catch (...) {
  // success
};

-2-检查它没有

try {
   f();
} catch(...) {
   // notify test failure here
}

答案 4 :(得分:-1)

您可以考虑使用assert

你可能会问的是什么断言:

  

断言是JavaTM编程语言中的一个语句,使您可以测试有关程序的假设。例如,如果您编写一个计算粒子速度的方法,您可能会断言计算出的速度小于光速。

我没有详细说明,因为我无法解释它比自己的文件更好。