使用Mockito测试Callback回调,你学会了吗?

发表于:2023-8-02 09:30

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:JAVA微学堂    来源:今日头条

  概述
  在这个简短的教程中,我们将重点介绍如何使用流行的测试框架Mockito测试回调。
  我们将探索两种解决方案,首先使用ArgumentCaptor,然后使用直观的doAnswer()方法。
  Callback回调简介
  Callback回调函数是作为参数传递给方法,该方法应在给定时间执行回调参数。
  使用回调的一个常见场景是在服务交互期间,当我们需要处理来自服务调用的响应时。比如:
  public interface Service {
      void doAction(String request, Callback<Response> callback);
  }
  在回调参数中,我们传递一个类,该类将使用reply(T response)方法处理响应:
  public interface Callback<T> {
      void reply(T response);
  }
  我们将使用一个简单的服务示例来演示如何传递和调用回调:
  public void doAction() {
      service.doAction("our-request", new Callback<Response>() {
          @Override
          public void reply(Response response) {
              handleResponse(response);
          }
      });
  }
  private void handleResponse(Response response) {
      if (response.isValid()) {
          response.setData(new Data("Successful data response"));
      }
  }
  我们选择使用Java Lamda表达式写得更简洁:
  service.doAction("our-request", response -> handleResponse(response));
  使用ArgumentCaptor
  现在,让我们看看Mockito如何使用ArgumentCaptor来获取回调对象:
  @Test
  public void givenServiceWithValidResponse_whenCallbackReceived_thenProcessed() {
      ActionHandler handler = new ActionHandler(service);
      handler.doAction();
      verify(service).doAction(anyString(), callbackCaptor.capture());
      Callback<Response> callback = callbackCaptor.getValue();
      Response response = new Response();
      callback.reply(response);
      String expectedMessage = "Successful data response";
      Data data = response.getData();
      assertEquals(
        "Should receive a successful message: ", 
        expectedMessage, data.getMessage());
  }
  在本例中,我们首先创建一个ActionHandler,然后调用该处理程序的doAction方法。这只是service.doAction方法调用的包装器,我们在这里调用回调。
  接下来,我们验证doAction是否在mock服务实例上被调用,并将anyString()作为第一个参数,将callbackCaptor.capture()作为第二个参数,这就是我们捕获回调对象的地方。然后可以使用getValue()方法返回参数的捕获值。
  现在我们有了回调对象,创建一个默认有效的Response对象,直接调用reply方法并断言响应数据具有正确值。
  使用doAnswer()方法
  现在,我们将使用Mockito的Answer对象和doAnswer方法来存根void方法doAction:
  @Test
  public void givenServiceWithInvalidResponse_whenCallbackReceived_thenNotProcessed() {
      Response response = new Response();
      response.setIsValid(false);
      doAnswer((Answer<Void>) invocation -> {
          Callback<Response> callback = invocation.getArgument(1);
          callback.reply(response);
          Data data = response.getData();
          assertNull("No data in invalid response: ", data);
          return null;
      }).when(service)
          .doAction(anyString(), any(Callback.class));
      ActionHandler handler = new ActionHandler(service);
      handler.doAction();
  }
  在第二个示例中,我们首先创建一个无效的Response对象,该对象将在稍后的测试中使用。
  接下来,我们在mock服务上设置Answer,以便在调用doAction时,我们拦截调用并使用invocation.getArgument(1)获取方法参数以获取回调参数。
  最后一步是创建ActionHandler并调用doAction,从而调用Answer。
  结论
  本文介绍了在使用Mockito进行测试时处理测试回调的两种不同方法,相比较使用doAnswer方式比较直观。
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号