繁体   English   中英

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

[英]How to override the behavior of a failed JUnit test case

我需要为永无止境的main()方法编写一个JUnit测试用例。 处理某些文件后,此main()方法休眠一分钟,然后恢复执行。 这个过程不断进行。

我使用以下代码为其编写了JUnit:

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

毫不奇怪,我的测试用例因java.lang.Exception失败:测试在10000毫秒消息后超时 即使main()方法按预期工作,该测试用例也会因超时异常而失败。 我该如何覆盖此失败的测试用例的行为,以便在发生超时异常的情况下,对于该测试用例,其结果应显示为“成功”。

编辑实际要求是:我需要从特定位置搜索文件,如果找到文件,则将其移动到其他文件夹。 此搜索应每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异常而导致测试用例是否完成,还是从其他对JUnit测试用例造成伤害的main()方法内部产生了异常。

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

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

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

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

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

您应该考虑分离长时间运行的单元测试。 如何实现这一点,例如此处此处 所示

我不明白你想做什么。 如果您收到超时异常,则表示测试用例运行时间过长。

如果要测试主方法,并且它包含一个无限循环,那么如何确定该方法可以按预期工作?

对于您的问题,使用

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM