Mockito:如何使服务调用抛出异常

1 java mocking mockito hystrix

我的班级中有需要测试的 Hystrix 命令。我能够模拟除后备之外的所有代码。要执行回退,我需要让我的 hystrix 包装方法抛出超时异常。我不明白该怎么做。有人可以帮我吗?我尝试在测试类上使用 @Enablecircuitbreaker 打开电路,但这并没有调用任何 Hystrix 异常:(

     @Mock
     private MDMConnectorService service;
     @InjectMocks
     private AIAUtilities aiaUtilities;

     @Test
  public void testFetchCustomerAccountDetailsHystrixTimeoutException() throws Exception {
    try {
      ConfigurationManager.getConfigInstance()
          .setProperty("hystrix.command.AIAClientCommand.circuitBreaker.forceOpen", "true");
      Mockito.when(service.fetchCustomerAccount(any(GetCustomerAccountType.class))).thenReturn(getTestAIARecord());
      GetCustomerAccountResponseType responseType = aiaUtilities
          .fetchCustomerAccountDetails(accountNumber);
      Assert.assertFalse(true);// if the flow came here, the test case has failed
    } catch (Exception ex) {
      if (ex instanceof DataAccessException) {
        assertEquals(Constants.ERRCODE_AIA_QUERY_TIMED_OUT,
            ((DataAccessException) ex).getErrorCode());
      } else {
        throw ex;
      }
    }
    finally {
      ConfigurationManager.getConfigInstance()
          .setProperty("hystrix.command.AIAClientCommand.circuitBreaker.forceOpen", "false");
    }
  }
Run Code Online (Sandbox Code Playgroud)

在这个测试中,被 hystrix 包裹的命令被调用

    GetCustomerAccountResponseType responseType = aiaUtilities
      .fetchCustomerAccountDetails(accountNumber);
Run Code Online (Sandbox Code Playgroud)

具有 hystrix 命令和相应回退的 AIAUtilities 的代码是

    @HystrixCommand(commandKey = "AIAClientCommand", fallbackMethod = "aiaClientCommandFallback")
    public GetCustomerAccountResponseType fetchCustomerAccountDetails(String accountNumber)
        throws DataAccessException {
      GetCustomerAccountResponseType response;

      try {

        if (generalUtil.isObjectEmpty(authHeader)) {
        authHeader = iamUtilities.createAuthHeaderAndRenewOfflineTicket();
      }
      factory = getFactory();
      request = getRequest();
      accountNumberType = getAccountNumberType();
      accountNumberType.setValue(accountNumber);
      request.setCustomerAccountNumber(accountNumberType);
      request.setSourceId(Constants.VAL_QUICKBASE_SOURCE_AIA);
      serviceClass = getServiceClass();
      service = getService();
      provider = getProvider();;
      provider.getRequestContext().put("Authorization", authHeader);
      provider.getRequestContext().replace("SOAPAction", "fetchCustomerAccount");
      provider.getRequestContext().put("Content-Type", "text/xml");

      response = service.fetchCustomerAccount(request);
      } catch (DataAccessException e) {
        throw e;
      }
      catch (Exception e) {
        if(e instanceof HystrixRuntimeException && e.getCause() instanceof TimeoutException) {
          DataAccessException dataAccessException = (DataAccessException) ((HystrixRuntimeException) e)
              .getFallbackException().getCause();
          throw new DataAccessException(dataAccessException.getErrorCode(),
              "Exception in validateLicense.fetchCustomerAccountDetails::" + e.getMessage(),e);
        }
        else
        throw new DataAccessException(Constants.ERRCODE_AIA_EXCEPTION,
            "Exception in validateLicense.fetchCustomerAccountDetails:::" + e.toString(), e);
      }
      return response;
    }

    private GetCustomerAccountResponseType aiaClientCommandFallback(String accountNumber, Throwable e)
        throws DataAccessException {
      logger.error("Inside AIAClientCommandFallback : Error is ::" + e.toString());
      if(e instanceof HystrixTimeoutException)
        throw new DataAccessException(Constants.ERRCODE_AIA_QUERY_TIMED_OUT,
            "Exception in AIAClientCommandFallback::" + e.toString(),e);
      else if(e instanceof DataAccessException)
        throw (DataAccessException)e;
      else
        throw new DataAccessException(Constants.ERRCODE_AIA_EXCEPTION,
          "Inside AIAClientCommandFallback : Error is ::" + e.toString(), e);
    }
Run Code Online (Sandbox Code Playgroud)

tom*_*tom 5

而不是在你模拟的 fetchCustomerAccount 中返回一些东西,而是通过thenThrow以下方式抛出一个异常:

Mockito.when(service.fetchCustomerAccount(any(GetCustomerAccountType.class))).thenThrow(new RuntimeException("Timeout"));
Run Code Online (Sandbox Code Playgroud)