当前位置: 首页 > 知识库问答 >
问题:

使用Mockito对包含静态方法调用的函数进行单元测试

李嘉胜
2023-03-14

我有一个helper类,它包含一个公共静态方法getProductHandler(字符串名)

public class ProductHandlerManager {
  public static Handler getProductHandler(String name) {
        Handler handler = findProductHandler(name);
        return handler;
  }
}

一个定制服务类使用上面的ProductHandlerManager:

public class CustomerService {
   ...
   public void handleProduct() {
     Handler appleHandler = ProductHandlerManager.getProductHandler("apple");
     appleHandler.post(new Runnable() {
        @Override
        public void run() {
           //...
        }
     });
   }
}

我想在自定义服务类中使用单元测试handleProducts()方法。我尝试使用mockito模拟测试中的ProductManager.getProductHandler(苹果)部分,但是mockito不支持静态方法模拟。那么我如何使用mockito来单元测试handleProducts()函数呢?

请不要建议我使用Powermock,因为我读过一些文章,说如果我需要模拟静态方法,这表明设计不好。但是我可以接受关于代码重构的建议,使其可测试。

共有1个答案

堵恺
2023-03-14

您可以自己重构并指定处理程序。如果您将测试与被测试的类放在同一个包中,即使它们位于不同的源文件夹中(例如src vs testsrc),这些测试通常是包私有的。Guava(Google Commons)也有一个方便的@VisibleForTesting文档注释,尽管Javadoc也可以使用。

public class CustomerService {
  public void handleProduct() {
    handle(ProductHandlerManager.getProductHandler("apple"));
  }

  /** Visible for testing. */
  void handleProduct(Handler handler) {
    handler.post(new Runnable() {
       @Override
       public void run() {
          //...
       }
    });
  }
}

此时,您可以作为单元测试密集地测试handleProducts(Handler),然后只测试handleProducts()作为联调,以确保"apple"产品处理程序正确交互。

 类似资料:
  • 我有一个这样的方法。 > 如果我模拟记录器,是否必须将方法更改为post(字符串json,记录器记录器)?否则,如何使此模拟与该方法交互?

  • 我陷入了单元测试场景的一个基本问题,并将感谢帮助。 我有一个类,它调用在DB中将标志设置为true。 我的测试: 我被要求测试并检查是否正在使用相关数据调用。 由于返回类型无效,我如何测试它?

  • 我正在为我的应用程序创建一个Spring BootAPI。我试图使用mockito对我的服务实现进行单元测试,以模拟出细节。该服务将向数据库添加一个新的构建实体。下面是服务实现和测试实现。楼宇服务: BuildingServiceImpl_UT

  • 我有DaoImpl类: 我的测试是: 测试是成功的,但是当我运行具有覆盖率的junit测试时,它显示方法没有被覆盖,因此我的整体单元测试行覆盖率低于要求。我们能涵盖那部分吗?如果是,我们怎么做?谢了。

  • 令人沮丧的。我到处都能看到测试异步Vertx代码的示例,但没有任何内容接近我要测试的内容。 Vertx 3.3.2,JUnit 4.12,Java8 被测试的方法向事件总线发送消息。我想验证在eventBus()中发生的事情。发送()响应处理程序正在发生。 所以,我看到的许多例子在TEST ITSELF中有eventBus()。发送()方法(因此,测试事件总线的另一端——消费者)我想测试。发送()