Тест JUnit для Бина Step scoped с использованием StepScopeTestExecutionListener.class: По-прежнему появляется сообщение «Нет зарегистрированной области» - PullRequest
0 голосов
/ 09 апреля 2020

Я пытаюсь написать независимый пример модульного теста для "шагового" объекта EJB Я опубликовал этот вопрос ранее и понимаю, что мне нужно использовать StepScopeTestExecutionListener для создания шага для моего модульного теста; однако, я все еще получаю следующее исключение даже после использования StepScopeTestExecutionListener:

Caused by: java.lang.IllegalStateException: No Scope registered for scope name 'step'
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:343)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)

My JUnt

@TestExecutionListeners({ StepScopeTestExecutionListener.class,DependencyInjectionTestExecutionListener.class  })
@RunWith(SpringJUnit4ClassRunner.class)
@PropertySource("classpath:properties/common.properties")
@ContextConfiguration(locations = { "/spring/common-context.xml" })
public class ConfigDAOImplTest {

    @Autowired
    private ConfigDAOImpl configDAO;

    @Spy
    private ContextParamDAO contextParamDAO = new ContextParamDAOImpl();

    private static final String SCHEMA_CONFIG = "classpath:data/CONFIG_SCHEMA.sql";
    private static final String DATA_CONFIG = "classpath:data/CONFIG_DATA.sql";

    @Before
    public void init() {
        MockitoAnnotations.initMocks(this);

        DataSource dataSource = new EmbeddedDatabaseBuilder()
                .setType(EmbeddedDatabaseType.H2)
                .addScript(SCHEMA_CONFIG)
                .addScript(DATA_CONFIG)
                .build();

        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

        //override the jdbcTemplate for the test case    
        configDAO.setJdbcTemplate(jdbcTemplate);
        configDAO.setContextParamDAO(contextParamDAO);


    }

    public StepExecution getStepExecution() {

        JobParametersBuilder jobParametersBuilder = new JobParametersBuilder();
        jobParametersBuilder.addString("test", "test");
        JobParameters jobParameters = jobParametersBuilder.toJobParameters();

        JobInstance jobInstance = new JobInstance(12345L,"testJob");
        JobExecution jobExecution = new JobExecution(jobInstance,jobParameters);

        StepExecution execution = 
        MetaDataInstanceFactory.createStepExecution(jobExecution,"step",11245L);
        execution.getExecutionContext().putString("input.data", "foo,bar,spam");
        return execution;
    }
}

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

Вопрос: Почему область действия шага все еще не инициализируется для моего JUnit?

Примечание: На несвязанной заметке причина, по которой я вручную создаю JobExecution внутри getStepExecution вместо использования MetaDataInstanceFactory.createJobExecution, заключается в том, что по какой-то странной причине компилятор может найти createJobExecution метод, но метод не найден во время выполнения. Я использовал флаг -verbose:class и могу подтвердить, что существует только один jar, из которого загружается класс MetaDataInstanceFactory, и что jar также содержит требуемый метод. Я предполагаю, что создание экземпляра JobExecution вручную не должно быть причиной root моей проблемы.

1 Ответ

1 голос
/ 09 апреля 2020

Ошибка происходит перед даже при загрузке теста, поскольку в вашем файле common-context.xml не определен bean-компонент области действия. Так как вы не используете пространство имен пакета в этом файле, вам необходимо объявить область действия шага вручную. Вот выдержка из документов (от 3.0.10):

Because it is not part of the Spring container by default, 
the scope must be added explicitly, either by using the batch namespace
or by including a bean definition explicitly for the StepScope (but not both)

Добавление следующего в контекст вашего приложения должно решить проблему:

<bean class="org.springframework.batch.core.scope.StepScope">
   <property name="proxyTargetClass" value="true" />
</bean>
...