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

标签 java junit

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

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

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

毫不奇怪,我的测试用例失败并显示java.lang.Exception: test timed out after 10000 milliseconds 消息。即使 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
}   

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

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

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

最佳答案

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

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

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

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

关于java - 如何覆盖失败的 JUnit 测试用例的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20108945/

相关文章:

xml - 需要 XSL 文件将内部 xml 测试格式转换为 Junit 格式(jenkins 的 xUnit 插件)

java - 使用嵌入式 Cassandra 加速 Spring MockMvc 集成测试

java - Spring Application Context - 主文件夹和测试文件夹

java - Eclipse 不允许创建 AVD

java - 什么是NullPointerException,我该如何解决?

java - String s = "something"; 之间有什么区别?和字符串 s = 新字符串 ("something");

java - 用于使用消息驱动的 bean 和 Web 服务对 Java EE 应用程序进行功能测试的工具

java - 在 Java 中使用 MongoDB 中的日期范围进行查询

java - 什么是测试套件?

java - 在 Spring 中为方面功能编写集成测试