Как поймать или смоделировать непредвиденные исключения в тестах mockito + J-unit? - PullRequest
0 голосов
/ 28 июня 2019

Это функция в главном файле, для которой мне нужно написать тест для.

@Override
public void processTask(JobExecutionContext arg0) throws TaskException {

    if (BatchInputChannel.DB.toString().equals(runtimeContext.getProperties().getProperty(BATCH_CHANNEL_TYPE))) {
        return;
    } else if (BatchInputChannel.FILE.toString().equals(runtimeContext.getProperties().getProperty(BATCH_CHANNEL_TYPE))) {
        jobLauncher = (JobLauncher) beanFactory.getBean("jobLauncher");
        Job job = (Job) beanFactory.getBean("micorpFileLoadJob");
        JobParameters jobParameters = new JobParametersBuilder()
                                                                .addLong("time", System.currentTimeMillis())
                                                                .toJobParameters();
        try {
            JobExecution jobExecution = jobLauncher.run(job, jobParameters);
            System.out.println("jobExecution=="+jobExecution);
        } catch (JobExecutionAlreadyRunningException | JobRestartException | JobInstanceAlreadyCompleteException
                | JobParametersInvalidException e) {
            throw new ProcessingException("File Loading Failed" + e.getMessage());
        }
    }
}

И это тестовая функция, которую я пытался создать

@Test(expected = JobParametersInvalidException.class)
public void processTaskWithFileInputJobFailed5() throws Exception {
    when(mockruntimeContext.getProperties()).thenReturn(mockProperties);
    when(mockProperties.getProperty(BATCH_CHANNEL_TYPE)).thenReturn("FILE");

    when(mockbeanFactory.getBean("jobLauncher")).thenReturn(mockJobLauncher);
    when(mockbeanFactory.getBean("micorpFileLoadJob")).thenReturn(mockjob);

    mockjobParameters = new JobParametersBuilder().addLong("time", System.currentTimeMillis()).toJobParameters();
    when(mockJobLauncher.run(mockjob, mockjobParameters)).thenReturn(mockJobExecution);
    when(mockJobExecution.getStatus()).thenReturn(BatchStatus.FAILED);
    when(mockJobExecution.getJobConfigurationName()).thenReturn(null);
    Mockito.doThrow(new JobParametersInvalidException("Invalid")).when(mockJobLauncher).run(mockjob, mockjobParameters);
    inputFileLoaderTaskProcessor.processTask(mockjobExecutionContext);
}

Когда я выполняю проект как тест J-модуля, его ожидающее исключение обработки будет выдано, но я упомянул "JobParametersInvalidException" в ожидаемом.

Как видите, я добавил только одно исключение в эту функцию, чтобы охватить все исключения (внутри catch) в основной функции, что нужно сделать?

1 Ответ

1 голос
/ 28 июня 2019
Mockito.doThrow(new JobParametersInvalidException("Invalid")).when(mockJobLauncher).run(mockjob, mockjobParameters);

Этот doThrow не вызывается, так как параметры не будут совпадать.

В коде параметры задаются с помощью:

   JobParameters jobParameters = new JobParametersBuilder()
                                            .addLong("time", System.currentTimeMillis())
                                            .toJobParameters();

В модульном тестемакет соответствия задается с помощью:

mockjobParameters = new JobParametersBuilder().addLong("time", System.currentTimeMillis()).toJobParameters();

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

Измените настройку макета, чтобы ожидать любые параметры JobParameters, например что-то вроде:

Mockito.doThrow(new JobParametersInvalidException("Invalid")).when(mockJobLauncher).run(eq(mockjob), any(JobParameters.class));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...