当前位置: 首页 > 知识库问答 >
问题:

如何模拟自定义JdbcCursorItemReader在Spring Batch上的单个步骤单元测试?

邵诚
2023-03-14

我正在尝试创建一个Junit测试用例,用于测试批处理作业的单个步骤,而批处理作业又有一个自定义的JdbcCursorItemReader,并将数据写入平面文件。我无法模拟可以注入处理器以写入平面文件的数据。请帮忙。

我按照以下链接中的步骤创建了一个测试用例来启动一个单独的步骤:

https://docs.spring.io/spring-batch/trunk/reference/html/testing.html

由于我的reader组件是stepscope,所以我使用上面链接中第10.4节的上下文将所需的域对象放入ExecutionContext中,但在启动该步骤时,它不会识别相同的内容,而是执行我通过配置xml注入的实际SQL查询。

我的配置xml的步骤如下:

<step id="sample-step" next="next-step">
 <tasklet>
    <chunk reader="customJDBCReader" processor="customProcessor" 
     writer="customFlatFileItemWriter" commit-interval="XXX" />
 </tasklet>
</step>

My customreader实现了JdbcCursorItemReader,它定义了一个用于从数据库读取信息的SQL。

在我的单元测试中,我试图模拟数据,而不是依赖于数据库中的实际数据

private StepExecution execution;

@BeforeStep
public StepExecution getStepExection() {
    execution = MetaDataInstanceFactory.createStepExecution();
    return execution;
}

@Test
public void testSampleStep() throws UnexpectedInputException, ParseException, Exception {
    MyDomainObject domainObject= new MyDomainObject ();
    domainObject.setID("sampleID");
    domainObject.setName("sampleName");
    domainObject.setImage("sampleImage");
    execution.getExecutionContext().put("someKey", domainObject);
    execution.setReadCount(1);

    JobExecution jobExecution = jobLauncherTestUtils.launchStep("sample-step", jobParameters, execution.getExecutionContext());
    AssertFile.assertFileEquals(new FileSystemResource(EXPECTED_FILE), new FileSystemResource(OUTPUT_FILE));
}

预期结果应该是,launchstep需要从executionContext获取数据,而不是从数据库将数据写入faltfile。

共有1个答案

廉飞捷
2023-03-14

你的期望是错误的。如果该步骤使用了JdbcBatchItemWriter,那么无论您是否在执行上下文中模拟数据,该读取器都会在测试期间发出SQL查询。步骤的输入数据与存储在执行上下文中的数据不同。

在这种情况下,我建议在测试中使用嵌入式数据库,并用一些虚拟数据填充它。

希望这能有所帮助。

 类似资料:
  • 问题内容: 我已Spring Boot启用基本身份验证的应用程序。从数据库消耗。为了进行单元测试,我想对其进行模拟,以便从其他地方使用数据。 我该怎么做? 我的问题不是如何模拟自身,而是如何模拟使用它来通过基本身份验证测试Controller的方式。 以下是我的SpringSecurity配置: 总之,我怎么能嘲笑UserServiceDetails到SpringSecurity配置,所以我能单元

  • 对于复杂的批处理任务,测试用例在点对点的测试方法中可能变成难于管理的。这些情况下,凭你们自己的力量用测试用例测试各个步骤更加有用。AbstractJobTests类包含一个方法launchStep需要一个步骤名称和运行特定的步骤。这个方法允许更有针对性的测试通过这个步骤允许测试设置数据并验证其结果。 JobExecution jobExecution = jobLauncherTestUtils.

  • 我想找到一种方法对我的定制nginx模块进行单元测试,但失败了。有人能提供一些建议吗?我曾经找到过Test::Nginx框架,但它可以作为系统测试。有人告诉我,我可以使用ngx_lua_模块通过FFI的方式在nginx模块中公开C函数。有人知道怎么做吗?

  • 问题内容: 我刚开始使用Node,现在正在编写一些单元测试。对于前几个函数,我可以正常运行,但是现在我碰到了一个包含其中的函数。我的函数的简化版本如下所示: 我尝试使用基本节点断言测试库进行测试: 由于执行此操作的时间(以及结果)总是不同的,因此它将始终失败。 在Python中,我可以设置模拟类和对象。有没有一种方法可以在Node中解决此问题而无需将moment.utc()作为函数的参数? 问题答

  • 问题内容: 我正在使用RestTemplate 方法发布到端点。在我的测试文件中,我正在测试POST方法。但是用我目前的测试,我得到了POST请求。在测试文件中发出POST请求时,我需要模拟API的帮助 这是我的主文件 这是我的测试文件 问题答案: 您正在测试DataTestRepo类内部的逻辑,因此您不应模拟它。RestTemplate是DataTestRepo内部的一个依赖项,因此这正是您需要

  • 我正在使用jUnit 5为我的Spring引导服务类做单元测试。在服务类中,我是自动装配对象,用于调用其他类中的方法。在测试用例中,@Mock没有为@Autow的类创建对象。在这里,我给出了我的代码。 我的服务级别: 我的组件类 : 我的单元测试类: pom.xml 文件 : 在运行此测试时,我在imageProcessor.dummy(name)中获得空指针异常;