如何在Mockito + J单元测试中捕获或模拟意外的异常?

时间:2019-06-28 04:43:32

标签: java spring junit mockito

这是主文件中我需要为其编写测试的函数。

allow_delete

这是我尝试创建的测试功能

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

当我将项目作为J单元测试执行时,它预期会引发处理异常,但是我在预期中提到了“ JobParametersInvalidException”。

如您所见,我仅在此函数中添加了一个异常,以便覆盖主函数中的所有异常(在catch中)?

1 个答案:

答案 0 :(得分:1)

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