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

ItemReader集成测试抛出ClassCastExctive

苏健柏
2023-03-14

我正在尝试集成测试一个ItemReader——下面是一个类:

@Slf4j
public class StudioReader implements ItemReader<List<Studio>> {

   @Setter private zoneDao zoneDao;

   @Getter @Setter private BatchContext context;

   private AreaApi areaApi = new AreaApi();

   public List<Studio> read() throws Exception {

      return areaApi.getStudioLocations();
  }

这是我的豆子。xml:

<bean class="org.springframework.batch.core.scope.StepScope" />
<bean id="ItemReader" class="com.sync.studio.reader.StudioReader" scope="step">
   <property name="context" ref="BatchContext" />
   <property name="zoneDao" ref="zoneDao" />
</bean>

这是我想写的测试:

@ContextConfiguration(locations = {
        "classpath:config/studio-beans.xml",
        "classpath:config/test-context.xml"})
@TestExecutionListeners({
        DependencyInjectionTestExecutionListener.class,
        StepScopeTestExecutionListener.class })
public class StudioSyncReaderIT extends BaseTest {

    @Autowired
    private ItemReader<List<Studio>> reader;

    public StepExecution getStepExecution() {
        JobParameters jobParameters = new JobParametersBuilder()
                .toJobParameters();
        StepExecution execution = createStepExecution(
                jobParameters);
        return execution;
    }
    @Before
    public void setUp() {
        ((ItemStream) reader).open(new ExecutionContext()); } //ClassCastException

    @Test
    @DirtiesContext
    public void testReader() throws Exception {
        assertNotNull(reader.read());
    }

    @After
    public void tearDown() {
        ((ItemStream) reader).close(); //ClassCastException
    }
}

java.lang.ClassCastExctive:com.sun.proxy.$Proxy36不能在之前和之后转换为ItemReader。我错过了什么?是否还有其他需要设置的东西(例如配置xml中的任何注释或条目)?

共有2个答案

方嘉言
2023-03-14

将XML配置和Java配置与Spring批处理结合使用时,您最终会对如何为步骤范围的bean创建代理感到困惑。将步骤作用域的配置更改为以下内容:

<bean class="org.springframework.batch.core.scope.StepScope">
    <property name="proxyTargetClass" value="true"/>
</bean>
狄旻
2023-03-14

你的问题是一个ItemReader不是一个ItemStream.你的StudioReader需要实现org.springframework.batch.item.ItemStreamReader如果你想使用一个读取器作为流。

import org.springframework.batch.item.ItemStreamReader;

public class StudioReader implements ItemStreamReader<List<Studio>>{
   ...
}

您可以使用泛型类型将类型T设置为多个接口,以避免在@Before

public class StudioSyncReaderIT<T extends ItemReader<List<Studio>> & ItemStream > 
            extends BaseTest {

   @Autowired
   private T reader;
   @Before
   public void setUp() {
     reader.open(new ExecutionContext()); 
   }

   @After
   public void tearDown() {
    reader.close(); 
   }

}
@ContextConfiguration
@TestExecutionListeners({DependencyInjectionTestExecutionListener.class, StepScopeTestExecutionListener.class})
@RunWith(SpringJUnit4ClassRunner.class)
public class AutowireDependencyImplementedMultiInterfacesTest<T extends Supplier<List<String>> & Runnable & AutowireDependencyImplementedMultiInterfacesTest.Task> {
    @Autowired
    private T springTest;

    @Test
    public void inject() throws Throwable {
        assertThat(springTest, is(not(instanceOf(MockTask.class))));

        assertThat(springTest.get(), equalTo(singletonList("spring-test")));

        springTest.hasBeenRan(false);

        springTest.run();
        springTest.hasBeenRan(true);
    }


    @Configuration
    static class Config {

        @Bean("step")
        public StepScope stepScope() {
            return new StepScope();
        }

        @Bean
        @Scope(value = "step")
        public MockTask task() {
            return new MockTask("spring-test");
        }
    }

    interface Task {
        void hasBeenRan(boolean ran);
    }

    static class MockTask implements Supplier<List<String>>, Runnable, Task {

        private final List<String> descriptions;
        private boolean ran = false;

        public MockTask(String... descriptions) {
            this.descriptions = asList(descriptions);
        }

        @Override
        public void run() {
            ran = true;
        }

        @Override
        public List<String> get() {
            return descriptions;
        }

        public void hasBeenRan(boolean ran) {
            assertThat(this.ran, is(ran));
        }
    }
}
 类似资料:
  • 我在spring靴子上有一个 如果我对已启动的应用程序启动测试-测试确定如果我尝试只启动它,则会出现连接拒绝错误。 My Application.Properties对于单一启动和测试是相同的,并且位于resources和TestResources中。 application.class是

  • 英文原文:http://emberjs.com/guides/testing/integration/ 集成测试通常用来测试应用中得重要工作流。集成测试用来模拟用户交互和确认交互结果。 设置 为了对Ember应用进行集成测试,需要在测试框架中运行应用。首先需要将根元素(root element)设置为任意一个已知将存在的元素。如果根元素在测试运行时可见的话,这对测试驱动开发非常有用,带来的帮助非常

  • 主要内容:集成测试背后的原因,集成测试技术,集成测试方法,集成测试指南集成测试是单元测试后软件测试过程的第二个层次。在此测试中,软件的单元或单个组件在组中进行测试。集成测试级别的重点是在集成组件或单元之间交互时暴露缺陷。 单元测试使用模块进行测试,这些模块在集成测试中进行组合和测试。该软件使用许多软件模块开发,这些软件模块由不同的编码器或程序员编码。集成测试的目标是检查所有模块之间通信的正确性。 集成测试背后的原因 虽然软件应用程序的所有模块已经在单元测试中进行了测

  • 设计 集成测试包括 3 个模块:测试用例、测试环境以及测试引擎。 测试用例 用于定义待测试的 SQL 以及测试结果的断言数据。 每个用例定义一条 SQL,SQL 可定义多种数据库执行类型。 测试环境 用于搭建运行测试用例的数据库和 ShardingSphere-Proxy 环境。 环境又具体分为环境准备方式,数据库类型和场景。 环境准备方式分为 Native 和 Docker,未来还将增加 Emb

  • 我用Robolectric测试写了一个简单的hello-world。 我已经向build.gradle添加了正确的依赖项: 下面是我要测试的简单: 我运行的是Android Studio2.0预览版3B。 问题是:如何避免失败?

  • 我是Spring集成项目的新手,现在我需要用JavaDSL创建一个流并对其进行测试。我想出了这些流程。第一个应该由cron运行并调用第二个,后者调用HTTPendpoint并将XML响应转换为POJO: 现在我想测试流和模拟HTTP调用,但努力模拟HTTP处理程序,我尝试这样做: 但我总是在网上出错: mockIntegrationContext。替换信息Handlerfor(“bulkEndpo