Испорченный объект за всю весну - PullRequest
0 голосов
/ 02 марта 2020

Я хочу протестировать всю Spring Batch, но у меня проблема. У меня есть сервис для удаления строк в БД и в LDAP. Для BD я реализовал базу данных H2 в памяти, так что никаких проблем. Для LDAP сложнее иметь LDAP в памяти, поэтому я хочу подделать вызывающий метод DAO LDapRepository «delete» (LDapRepository является интерфейсом, а LDapRepositoryImpl аннотирован @Repository реализацией)

Поэтому я попытался ввести макет в мою конфигурацию, но это не работает. Тест завершается неудачей с исключением нулевого указателя, когда я пытаюсь сделать ложный вызов ldapRepository.removePerson (поэтому ldapRepository не корректно введен).

Как можно заменить бин LDapRepository в моей конфигурации?

Вот код теста:

@ContextConfiguration(locations = {"classpath:purge/job-test.xml"})
public class PurgeJobTest {

    @Autowired
    private JobLauncherTestUtils jobLauncherTestUtils;

    @InjectMocks
    @Qualifier(value = "ldapRepositoryImpl")
    private LdapRepository ldapRepository;

    @Test
    public void testExampleJob() throws Exception {

        Mockito.doNothing().when(ldapRepository.removePerson(any(String.class)));
        JobParameters jobParameters = new JobParametersBuilder()
                                            .addString("fichierJob", "/purge/job-test.xml")
                                            .addString("nomJob", "purgeJob").toJobParameters();
        JobExecution exec =jobLauncherTestUtils.launchJob(jobParameters);
        assertEquals(BatchStatus.COMPLETED, exec.getStatus());

    }

} 

1 Ответ

0 голосов
/ 03 марта 2020

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

Исключение нулевого указателя было вполне логичным c. Действительно, боб не был распознан в контексте, потому что нигде он не был правильно введен в него.

Это типичная ошибка, связанная с примером в этом посте Внедрение объектов Mockito Mock с использованием Spring JavaConfig и @ Autowired .

или этого другого сообщения: Injecting Mockito mocks в bean-компонент Spring

Итак, в моем тесте работы. xml я прокомментировал компонентное сканирование, в котором были объявлены мои "настоящие" LdapRepository "и LdapRepositoryImpl, и заменил их на:

    <bean id="ldapRepository" class="org.mockito.Mockito" factory-method="mock">
        <constructor-arg value="purge.batch.repository.LdapRepository" />
    </bean>

    <bean id="ldapRepositoryImpl" class="org.mockito.Mockito" factory-method="mock">
        <constructor-arg value="purge.batch.repository.LdapRepositoryImpl" />
    </bean>

(я мог бы разместить объявление bean-компонента перед компонентным сканированием, чтобы дать ему приоритет)

И это работает как талисман!

...