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

时间:2015-11-09 13:30:39

标签: java unit-testing junit 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() {
           //...
        }
     });
   }
}

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

请不要建议我使用Powermock,因为我读了一些文章说如果我需要模拟静态方法,它表示一个糟糕的设计。但我可以接受有关代码重构的建议,以使其可测试。

1 个答案:

答案 0 :(得分:0)

您可以自己重构并指定处理程序。如果您将测试放在与测试类相同的包中,即使它们位于不同的源文件夹(例如src vs testsrc),这些通常也可以是包私有的。 Guava (Google Commons)也有一个方便@VisibleForTesting documentation annotation,但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()作为集成测试,以确保" apple"产品处理程序正确交互。