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



我有一个助手类,它包含公共静态方法getProductHandler(String name):

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

CustomerService类使用上面的ProductHandlerManager:

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

我想在CustomerService类中对handleProduct()方法进行单元测试。我尝试在测试中使用mockito来模拟ProductManager.getProductHandler("apple")部分,但是,mockito不支持静态方法模拟。那么我该如何使用Mockito对handleProduct()函数进行单元测试呢?

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

您可以自己重构并指定一个处理程序。如果您将测试与要测试的类放在同一个包中,即使它们位于不同的源文件夹中(例如src与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() {
          //...
       }
    });
  }
}

在这一点上,您可以将handleProduct(Handler)作为单元测试进行密集测试,然后将handleProduct()作为集成测试进行测试,以确保"苹果"产品处理程序正确交互。

相关内容

  • 没有找到相关文章

最新更新