Java JSONIMReaderBuilder构建的单元测试阅读器
我有一个类,其中包含批处理作业中使用的bean: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
@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,或者,因为它是一个单元测试,所以只需在测试方法中创建读取器来单独测试它。