Java 如何重写失败的JUnit测试用例的行为

Java 如何重写失败的JUnit测试用例的行为,java,junit,Java,Junit,我需要为一个永无止境的main()方法编写一个JUnit测试用例。这个main()方法在处理一些文件后会休眠一分钟,然后继续执行。这个过程持续不断 我使用以下代码为其编写JUnit: @Test (timeout = 10000) public void testMainMethod() { ClassName.main(null); assertEquals(true, true); } 毫无疑问,我的测试用例失败了,出现了java.lang.Exception:test在100

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

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

@Test (timeout = 10000)
public void testMainMethod()
{
   ClassName.main(null);
   assertEquals(true, true);
}
毫无疑问,我的测试用例失败了,出现了java.lang.Exception:test在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()method},而所有其他方法都是私有的,所以我不能为它们编写JUnit测试用例。另外,main()方法不返回任何内容,它只将文件从一个文件夹移动到另一个文件夹,如果在一个过程中移动文件失败,它将在下一个过程中尝试执行相同的操作。所以,使用JUnit测试用例,我只想检查在整个过程中是否出现意外异常

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


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

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

如果您想测试main方法,并且它包含一个无限循环,那么如何确定该方法按预期工作

对于您的问题,请使用

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

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

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

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

2) 将主例程分解为无限循环控制部分和辅助部分。更好的是,将等待间隔设置为计算值


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

这非常令人困惑。1) 为什么总是有一个成功的assertEquals()?别提了。2) 你想测试什么?main()至少运行10000毫秒而不引发异常?3) 你是如何从main()返回的?也许您应该传递一个参数,告诉它在一定数量的循环之后停止。单元测试不是黑盒测试!好的单元测试是白盒测试,所以您应该在main方法中执行测试步骤(应该是其他方法)。