【发布时间】: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