Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JSONIMReaderBuilder构建的单元测试阅读器_Java_Spring_Unit Testing_Spring Boot_Spring Batch - Fatal编程技术网

Java JSONIMReaderBuilder构建的单元测试阅读器

Java JSONIMReaderBuilder构建的单元测试阅读器,java,spring,unit-testing,spring-boot,spring-batch,Java,Spring,Unit Testing,Spring Boot,Spring Batch,我有一个类,其中包含批处理作业中使用的bean: @Configuration public class JobBeans { @Bean JsonItemReader<Rabbit> jsonReader() { return new JsonItemReaderBuilder<Rabbit>() .jsonObjectReader(new JacksonJsonObjectReader<>(Rabb

我有一个类,其中包含批处理作业中使用的bean:

@Configuration
public class JobBeans { 
    @Bean
    JsonItemReader<Rabbit> jsonReader() {
        return new JsonItemReaderBuilder<Rabbit>()
            .jsonObjectReader(new JacksonJsonObjectReader<>(Rabbit.class))
            .resource(new ClassPathResource("rabbits.json"))
            .name("rabbitReader")
            .build();
    }
}
我怎样才能像这样测试豆子

我当前的测试套件如下所示:

@ContextConfiguration(classes = JobBeans.class)
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, StepScopeTestExecutionListener.class })
@RunWith(SpringRunner.class)
public class RabbitReaderTest {

    @Autowired
    private JsonItemReader<Rabbit> sut;

    @Test
    public void read() throws Exception {
        assertNotNull(sut.read());
    }
}
它在测试执行期间抛出一个NPE:

10:40:07.684[线程-0]警告 org.springframework.beans.factory.support.DisposableBeanAdapter- 在名为的bean上调用销毁方法“close”失败 “读兔人” org.springframework.batch.item.ItemStreamException:运行时出错 收尾项目读取器位于 org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader.closeAbstractItemCountingItemStreamItemReader.java:138 在sun.reflect.NativeMethodAccessorImpl.invoke0Native方法在 sun.reflect.NativeMethodAccessorImpl.invokeNativeMethodAccessorImpl.java:62 在 sun.reflect.DelegatingMethodAccessorImpl.invokeDelegatingMethodAccessorImpl.java:43 java:498 at org.springframework.beans.factory.support.DisposableBeanAdapter.invokeCustomDestroyMethodDisposableBeanAdapter.java:364 在 java:287 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroyBeanDefaultSingletonBeanRegistry.java:578 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingletonDefaultSingletonBeanRegistry.java:554 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.destroySingletonDefaultListableBeanFactory.java:961 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.DestroysSingletonsDefaultSingletonBeanRegistry.java:523 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.DestroysSingletonsDefaultListableBeanFactory.java:968 在 org.springframework.context.support.AbstractApplicationContext.destroyBeansAbstractApplicationContext.java:1033 在 org.springframework.context.support.AbstractApplicationContext.doCloseAbstractApplicationContext.java:1009 在 org.springframework.context.support.AbstractApplicationContext$2.runAbstractApplicationContext.java:928
原因:java.lang.NullPointerException:null org.springframework.batch.item.json.JacksonJsonObjectReader.closeJacksonJsonObjectReader.java:89 在 org.springframework.batch.item.json.JsonItemReader.doCloseJsonItemReader.java:123 在 org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader.closeAbstractItemCountingItemStreamItemReader.java:135 ... 省略14个公共框架

即使文件是在测试资源目录中提供的,InputStream似乎也是空的。

看起来调用了读取器的close方法,但没有调用open方法。在使用读卡器读取数据之前,需要先打开读卡器。例如:

@Test
public void read() throws Exception {
    sut.open(new ExecutionContext());
    assertNotNull(sut.read());
    sut.close();
}

谢谢你的帮助!不幸的是,它仍然会产生相同的NPE。测试中调用的close方法在哪里?原因是:java.lang.NullPointerException:null位于org.springframework.batch.item.json.JacksonJsonObjectReader.closeJacksonJsonObjectReader.java:89位于org.springframework.batch.item.json.JsonItemReader.doCloseJsonItemReader.java:123位于org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader.closeAbstractItemCountingItemStreamItemReader.java:135读取方法不调用close。它应该在你测试后的某个地方调用。请提供完整的单元测试配置,以便我可以提供帮助。我不确定您是否可以这样做,因为ContextConfiguration注释在类级别工作。您可能可以分离bean,或者,因为它是一个单元测试,所以只需在测试方法中创建读取器来单独测试它。