/* * Copyright 2009-2012 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.springframework.batch.item; import static org.junit.Assert.*; import org.springframework.batch.item.sample.Foo; import org.junit.Before; import org.junit.After; import org.junit.Test; /** * Common tests for readers implementing both {@link ItemReader} and * {@link ItemStream}. Expected input is five {@link Foo} objects with values 1 * to 5. */ public abstract class AbstractItemStreamItemReaderTests extends AbstractItemReaderTests { protected ExecutionContext executionContext = new ExecutionContext(); /** * Cast the reader to ItemStream. */ protected ItemStream testedAsStream() { return (ItemStream) tested; } @Override @Before public void setUp() throws Exception { super.setUp(); testedAsStream().open(executionContext); } @After public void tearDown() throws Exception { testedAsStream().close(); } /** * Restart scenario - read items, update execution context, create new * reader and restore from restart data - the new input source should * continue where the old one finished. */ @Test public void testRestart() throws Exception { testedAsStream().update(executionContext); Foo foo1 = tested.read(); assertEquals(1, foo1.getValue()); Foo foo2 = tested.read(); assertEquals(2, foo2.getValue()); testedAsStream().update(executionContext); testedAsStream().close(); // create new input source tested = getItemReader(); testedAsStream().open(executionContext); Foo fooAfterRestart = tested.read(); assertEquals(3, fooAfterRestart.getValue()); } /** * Restart scenario - read items, rollback to last marked position, update * execution context, create new reader and restore from restart data - the * new input source should continue where the old one finished. */ @Test public void testResetAndRestart() throws Exception { testedAsStream().update(executionContext); Foo foo1 = tested.read(); assertEquals(1, foo1.getValue()); Foo foo2 = tested.read(); assertEquals(2, foo2.getValue()); testedAsStream().update(executionContext); Foo foo3 = tested.read(); assertEquals(3, foo3.getValue()); testedAsStream().close(); // create new input source tested = getItemReader(); testedAsStream().open(executionContext); Foo fooAfterRestart = tested.read(); assertEquals(3, fooAfterRestart.getValue()); } @Test public void testReopen() throws Exception { testedAsStream().update(executionContext); Foo foo1 = tested.read(); assertEquals(1, foo1.getValue()); Foo foo2 = tested.read(); assertEquals(2, foo2.getValue()); testedAsStream().update(executionContext); // create new input source testedAsStream().close(); testedAsStream().open(executionContext); Foo fooAfterRestart = tested.read(); assertEquals(3, fooAfterRestart.getValue()); } }