如何覆盖失败的JUnit测试用例的行为

时间:2013-11-20 23:00:35

标签: java junit

我需要为永无止境的main()方法编写一个JUnit测试用例。处理完一些文件后,这个main()方法会休眠一分钟然后恢复执行。这个过程一直在继续。

我使用下面的代码为它编写JUnit:

@Test (timeout = 10000)
public void testMainMethod()
{
   ClassName.main(null);
   assertEquals(true, true);
}

毫不奇怪,我的测试用例因 java.lang.Exception:10000毫秒后测试超时消息而失败。即使main()方法按预期工作,这个测试用例也会因超时异常而失败。我怎么能覆盖这个失败的测试用例的行为,以便在超时异常的情况下,它应该为这个测试用例显示结果为“Succeeded”。

修改 的 实际要求是: 我需要从特定位置搜索文件,如果找到任何文件,则将它们移动到不同的文件夹。此搜索应每30分钟进行一次。为此,我使用了以下代码:

public class FaxProcessor {
public static void main(String[] args) {
        LOGGER.info("*** Starting Fax Server Processor ***");
        int poll_time = 1800000;
        LOGGER.info("Poll Time set to " + poll_time + " millisec");

        FaxProcessor faxProcessor = new FaxProcessor();

        while (true) {
            try {
                if(LOGGER.debugEnabled()){
                    LOGGER.debug("Starting new pass of fax processor");
                }
                faxProcessor.startProcessing();
            } catch (Exception e) {
                LOGGER.error("Processing Error", e);
            } finally {
                try {
                    // Wait for next loop
                    Thread.sleep(poll_time);
                } catch (InterruptedException e) {
                    LOGGER.error("Thread Exception", e);
                }
            }
        }
    }
    // startProcessing and other private methods here
}   

最大的问题是,我只有一个公共方法{main()方法}而所有其他方法都是私有的,所以我不能为它们编写JUnit测试用例。此外,main()方法不返回任何内容,它只将文件从一个文件夹移动到另一个文件夹,如果在一次传递中移动文件失败,它会尝试在下一次传递中执行相同的操作。因此,使用JUnit测试用例,我只想检查整个过程中是否会发生意外异常。

如果我不在JUnit中指定超时,则测试用例永远不会完成。一旦发生超时,我想检查测试用例是否由于Timeout异常而完成,或者是来自main()方法的一些其他异常来自JUnit测试用例。

如果它是Timeout异常,这意味着,我的程序中的所有内容都朝着正确的方向发展,直到发生超时,因此测试用例应该成功。在所有其他情况下,它应显示FAILED为JUnit状态。

3 个答案:

答案 0 :(得分:1)

您已经人为地限制了您的测试环境,并声明:“我只有一​​个公共方法{main()方法}而所有其他方法都是私有的” - 谁说?如果这是您老师强加的要求,那么您应该认真考虑退出课堂。

1)正确的测试意味着测试a)候选文件被识别,b)候选文件被移动,以及c)操作定期发生。

2)将主程序计入无限循环控制部分和工人部分。更好的是,将等待间隔设为计算值。

3)使用protected方法而不是私有方法。由于它们受到保护,您现在可以使用子类来根据需要访问方法,而不会违反必要的封装。

答案 1 :(得分:0)

您应该考虑分离长时间运行的单元测试。如何实现这一目标,例如shown herehere

答案 2 :(得分:-1)

我不明白你想做什么。 如果你有Timeout Exception,那意味着测试用例运行时间过长。

如果要测试main方法,并且它包含无限循环,那么如何确定方法是否按预期工作?

对于您的问题,请使用

@Test (timeout = 10000, expected=Exception.class)