2016-09-14 148 views
1

我们可以使用JUnit来测试Java批处理作业吗?由于Junit在本地运行并且Java批处理作业在服务器上运行,所以我不确定如何从JUnit测试用例开始一个工作(我尝试使用JobOperator类)。JSR:352单元测试Java批处理代码?

如果JUnit不是正确的工具,我们该如何单元测试java批处理代码。

我使用IBM的实现JSR 352的运行使用WAS自由

回答

2

JUnit是首先的自动化测试显示器框架。含义:你可以用它来驱动各种@Test方法。

从概念上看,unit tests的定义很模糊;如果你遵循维基百科,“你做任何测试的事情”都可以看作是单元测试。当然,从这个角度来看,您可以“单元测试”在批处理框架上运行的批处理代码。

但是:大多数人认为“真实”,“有用”的单元测试做不是要求存在任何外部事物。这些测试可以在构建时“在本地”运行。无需服务器,文件系统,网络,...

牢记这一点,我认为有两件事情可以一起工作:

  1. 您可以使用JUnit推动“一体化”或者“功能测试“。含义:您可以定义测试套件来完成“完整的事情” - 定义批次,并处理它们以最终检查预期结果。如上所述,这将是集成测试,确保端到端流程按预期工作。
  2. 你看看“正常”JUnit unit-testing。含义:您将重点放在代码中与批处理框架“不相关”的那些方面(换句话说,注意POJO)并对这些方面进行单元测试。本地;也许是嘲笑框架;而不依赖于运行代码的真正批处理服务。
2

建立在@GhostCat的答案上,似乎你问的是如何在测试中驾驶完整的工作(他的子弹1.)。 (当然单位单独测试读取器/处理器/写器组件也可以是有用的。)

你的基本选项是:

  1. 使用的Arquillian(见here中的链接了解如何开始使用的Arquillian和自由)在服务器上运行测试,但让Arquillian处理将应用程序部署到服务器并收集结果的任务。

  2. 通过JobOperator界面编写您自己的servlet线束来驱动您的工作。请参阅@aguibert以this question为出发点的答案。请注意,除非您的工作有其他方法让提交者了解,否则您可能想编写自己的简单例程来轮询JobExecution中的“完成”状态(COMPLETED,FAILED或STOPPED)之一。


另一种技术需要牢记的是启动Bean。

@Startup 
@Singleton 
public class StartupBean { 

    JobOperator jobOp = BatchRuntime.getJobOperator(); 

    // Drive job(s) on startup. 
    jobOp.start(...);   

如果你有办法检查结果从使用JobOperator接口(您必须分开工作这可能是有用的:您可以通过使用启动Bean,如启动服务器,只需运行你的工作在服务器中)。您的测试只需轮询并检查工作结果。您甚至不必打开HTTP端口,服务器启动开销只有几秒钟。