繁体   English   中英

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

[英]Use Mockito to unit test a function which contains static method call & async task

我有一个帮助器类,其中包含一个公共静态方法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 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() {
          //...
       }
    });
  }
}

此时,您可以对handleProduct(Handler)进行密集测试作为单元测试,然后仅对handleProduct()进行集成测试,以确保“ apple”产品处理程序正确交互。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM