Как смоделировать пользовательский JdbcCursorItemReader во время отдельного пошагового модульного тестирования в Spring Batch? - PullRequest
0 голосов
/ 15 февраля 2019

Я пытаюсь создать тестовый пример Junit для тестирования отдельного шага моего пакетного задания, которое, в свою очередь, имеет пользовательский JdbcCursorItemReader и записывает данные в плоский файл.Я не могу смоделировать данные, которые могут быть введены в процессор для записи в плоский файл.Пожалуйста, помогите.

Я следовал шагам по ссылке ниже, чтобы создать тестовый пример для запуска отдельного шага:

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

Поскольку мой компонент считывателя - это приставка, я используюконтекст вокруг раздела 10.4 в приведенной выше ссылке позволяет поместить необходимые доменные объекты в ExecutionContext, но при запуске шага он не распознает то же самое, а выполняет фактический запрос SQL, который я внедряю через config xml.

Моя конфигурация xml имеет следующий шаг:

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

Мой 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));
}

Ожидаемый результат должен состоять в том, что на этапе запуска необходимо получить данные из executionContext вместо базы данных, чтобы записать их в faltfile.

1 Ответ

0 голосов
/ 05 марта 2019

Ваше ожидание неверно.Если на шаге используется JdbcBatchItemWriter, этот читатель по-прежнему будет выдавать SQL-запрос во время теста, независимо от того, ли вы высмеивали данные в контексте выполнения или нет.Входные данные шага отличаются от данных, хранящихся в контексте выполнения.

В этом случае я бы рекомендовал использовать встроенную базу данных в своем тесте и заполнить ее некоторыми фиктивными данными.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...