【问题标题】:JUnit 'AssertionError' on Expected exception even when the exception is thrown即使抛出异常,JUnit 'AssertionError' on Expected exception
【发布时间】:2017-03-24 19:11:58
【问题描述】:

我有一个函数,我想测试它是否会引发异常:

 @Override
    public WorkOrderTask updateWorkOrderTaskWithOutcome(String taskId, String outcome, WorkOrderTask workOrderTask) {
        Map<String, Object> variables = new HashMap<>();

        if (!outcome.equals(TaskOutcomes.CANCEL.getValue())) {
            WorkOrderType workOrder = workOrderTask.getWorkOrderPayload().getWorkOrder();
            workOrder = workflowDataService.updateWorkOrder(workOrder);
            workOrderTask.getWorkOrderPayload().setWorkOrder(workOrder);

            variables = getProcessVariables(workOrder);
        }

        try {
            workflowTaskService.completeTask(taskId, outcome, variables);
            logger.debug("Updated Task ID: {} with outcome {}", taskId, outcome);
        } catch (WorkflowException e) {
            logger.error("Updating Work Order Task ID: {} with outcome {} FAILED", taskId, outcome, e);
        }

        return workOrderTask;
    }

我写的测试是这样的:

@Test(expected=WorkflowException.class)
public void testUpdateWorkOrderTaskForWorkflowException() throws Exception {
    WorkOrderTask workOrderTask = GrcWorkflowTestUtil.generateWorkOrderTask();
    WorkOrderType workOrder = workOrderTask.getWorkOrderPayload().getWorkOrder();

    doReturn(workOrder).when(workflowDataService).updateWorkOrder(workOrder);//some mock stubs to avoid calling actual service
    doThrow(new WorkflowException("test workflow exception")).when(workflowTaskService).completeTask(any(), any(), any());//forcing the exception to be thrown

    WorkOrderTask workOrderTaskRet = workOrderService.updateWorkOrderTaskWithOutcome(TestEnvironmentUtil.TASK_ID,
            TaskOutcomes.SUBMIT.getValue(), workOrderTask);

}

现在,当我运行测试时,我得到 > AssertionError:excepted exception :workflowException,即使我可以看到(调试)workflowException 被抛出。

我确实读过这个类似的问题: Testing for Exceptions using JUnit. Test fails even if the Exception is caught

但答案说我必须跳过 try catch 块,这是我不想做的事情。

另外,测试的重点是确保异常被捕获,我知道这似乎是我在测试实现而不是 API,但我不想触发实际的异常,因为这会保证调用实际的服务

【问题讨论】:

  • 如果您测试的方法本身没有抛出异常,那么您无法以这种方式对其进行测试。但是您的代码记录异常,您可以(并且应该)测试您的代码的行为。

标签: java unit-testing exception junit


【解决方案1】:

您想确保您的代码捕获 WorkflowException 吗? 但是你已经在这里了:

    doThrow(new WorkflowException("test workflow exception"))
    .when(workflowTaskService).completeTask(any(), any(), any());

如果测试执行没有引发异常,则表示该模拟操作中引发的异常被捕获。
所以不应该指定@Test(expected=WorkflowException.class)

如果您想确定是否执行了模拟方法,您仍然可以验证是否调用了 workflowTaskService.completeTask()。而如果被调用,就意味着抛出了异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-09
    相关资源
    最近更新 更多