Написание теста JUnit для bean-объекта "Step" - не зарегистрировано ни одной области действия для имени области "step" (Spring Batch 3.0.10) - PullRequest
0 голосов
/ 08 апреля 2020

Я хочу написать тестовый пример JUnit для управляемого компонента Spring, который имеет область действия как "шаг". На этот боб ссылается Spring Batch Tasklet.

Определение компонента для класса configDAO ConfigDAOImpl

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:tx="http://www.springframework.org/schema/tx" xmlns:batch="http://www.springframework.org/schema/batch"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd        
        http://www.springframework.org/schema/tx 
        http://www.springframework.org/schema/tx/spring-tx-2.5.xsd      
        http://www.springframework.org/schema/batch 
        http://www.springframework.org/schema/batch/spring-batch.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

    <!-- bean has been defined with a scope of "step" as it uses the stepExecutionContext -->
    <bean id="configDAO"
        class="com.myproject.common.dataaccess.impl.ConfigDAOImpl" scope="step">
        <property name="jdbcTemplate" ref="jdbcTemplate" />
        <property name="corePoolSize" value="${threadpool.size}"/>
        <property name="frequency" value="#{stepExecutionContext['frequency']}" />
    </bean>
</beans>

Тестовый блок JUnit для вышеуказанного компонента

@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);


    }

    //.. more coode
}

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

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)

Я устал добавлять аннотацию @EnableBatchProcessing над моим тестовым классом, но это не решило проблему.

Как мне написать тест JUnit для step bean-объекта в области?

1 Ответ

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

Более подробную информацию вы найдете в официальной документации, есть раздел под названием "Тестирование компонентов ступенчатой ​​области" . Но для начала вы должны аннотировать свой Тест с помощью этих двух аннотаций (до Spring 4.1), включающих область действия вашего шага.

@TestExecutionListeners( { DependencyInjectionTestExecutionListener.class,
    StepScopeTestExecutionListener.class })

Или эту аннотацию для Spring 4.1 +

@SpringBatchTest

You затем также необходимо определить StepExecution, аналогичный этому (и взятый из документации)

public StepExecution getStepExecution() {
        StepExecution execution = MetaDataInstanceFactory.createStepExecution();
        execution.getExecutionContext().putString("input.data", "foo,bar,spam");
        return execution;
    }
...