我们可以使用 JUnit 来测试 java 批处理作业吗?由于 Junit 在本地运行并且 java 批处理作业在服务器上运行,我不确定如何从 JUnit 测试用例启动作业(我尝试使用 JobOperator 类)。
如果 JUnit 不是正确的工具,我们如何对 java 批处理代码进行单元测试。
我正在使用 IBM 在 WAS Liberty 上运行的 JSR 352 实现
我们可以使用 JUnit 来测试 java 批处理作业吗?由于 Junit 在本地运行并且 java 批处理作业在服务器上运行,我不确定如何从 JUnit 测试用例启动作业(我尝试使用 JobOperator 类)。
如果 JUnit 不是正确的工具,我们如何对 java 批处理代码进行单元测试。
我正在使用 IBM 在 WAS Liberty 上运行的 JSR 352 实现
基于@GhostCat 的答案,您似乎在问如何在测试中完成全部工作(他的项目符号 1.)。(当然,单独对读取器/处理器/写入器组件进行单元测试也很有用。)
您的基本选择是:
使用 Arquillian(有关 Arquillian 和 Liberty 入门的链接,请参阅此处)在服务器中运行您的测试,但让 Arquillian 处理将应用程序部署到服务器并收集结果的任务。
编写您自己的 servlet 工具,通过 JobOperator 接口驱动您的工作。请参阅@aguibert对此问题的回答作为起点。请注意,您可能希望编写自己的简单例程来轮询 JobExecution 以获取“已完成”状态之一(COMPLETED、FAILED 或 STOPPED),除非您的作业有其他方法可以让提交者知道。
要记住的另一种技术是启动 bean。您可以简单地通过使用启动 bean 启动服务器来运行您的作业,例如:
@Startup
@Singleton
public class StartupBean {
JobOperator jobOp = BatchRuntime.getJobOperator();
// Drive job(s) on startup.
jobOp.start(...);
如果您有一种方法可以独立于使用 JobOperator 接口(为此您需要在服务器中)来检查作业结果,这将很有用。您的测试可以简单地轮询和检查作业结果。您甚至不必打开一个 HTTP 端口,服务器启动开销只有几秒钟。
JUnit 首先是一个自动化和测试监控框架。含义:你可以用它来驱动各种@Test 方法。
从概念上讲,单元测试的定义相当模糊。如果您关注维基百科,“您为测试某事所做的一切”都可以视为单元测试。当然,按照这种观点,您可以“单元测试”在批处理框架上运行的批处理代码。
但是:大多数人认为“真正的”、“有用的”单元测试不需要任何外部事物的存在。这样的测试可以在构建时“本地”运行。无需服务器、文件系统、网络……
牢记这一点,我认为您可以使用两件事: