我需要为永无止境的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状态。
答案 0 :(得分:1)
您已经人为地限制了您的测试环境,并声明:“我只有一个公共方法{main()方法}而所有其他方法都是私有的” - 谁说?如果这是您老师强加的要求,那么您应该认真考虑退出课堂。
1)正确的测试意味着测试a)候选文件被识别,b)候选文件被移动,以及c)操作定期发生。
2)将主程序计入无限循环控制部分和工人部分。更好的是,将等待间隔设为计算值。
3)使用protected
方法而不是私有方法。由于它们受到保护,您现在可以使用子类来根据需要访问方法,而不会违反必要的封装。
答案 1 :(得分:0)
您应该考虑分离长时间运行的单元测试。如何实现这一目标,例如shown here或here。
答案 2 :(得分:-1)
我不明白你想做什么。 如果你有Timeout Exception,那意味着测试用例运行时间过长。
如果要测试main方法,并且它包含无限循环,那么如何确定方法是否按预期工作?
对于您的问题,请使用
@Test (timeout = 10000, expected=Exception.class)