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

Java 使用Mockito对包含静态方法调用的函数进行单元测试&;异步任务,java,unit-testing,junit,mockito,Java,Unit Testing,Junit,Mockito,我有一个helper类,它包含一个公共静态方法getProductHandler(字符串名): CustomerService类使用上述ProductHandlerManager: public class CustomerService { ... public void handleProduct() { Handler appleHandler = ProductHandlerManager.getProductHandler("apple"); apple

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

CustomerService
类使用上述
ProductHandlerManager

public class CustomerService {
   ...
   public void handleProduct() {
     Handler appleHandler = ProductHandlerManager.getProductHandler("apple");
     appleHandler.post(new Runnable() {
        @Override
        public void run() {
           //...
        }
     });
   }
}
我想在
CustomerService
类中对
handleProduct()
方法进行单元测试。我尝试使用模拟测试中的
ProductManager.getProductHandler(“apple”)
部分,但是,mockito不支持静态方法模拟。那么我如何使用Mockito来单元测试
handleProduct()
函数呢


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

您可以自己重构并指定处理程序。如果您将测试与被测试的类放在同一个包中,即使它们位于不同的源文件夹中(例如src与testsrc),这些测试通常是包私有的。虽然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(handle)
作为单元测试进行密集测试,然后仅将
handleProduct()
作为集成测试进行测试,以确保“apple”产品处理程序能够正确交互。

您的原始问题已经回答了这个问题。让它成为一个实例(非静态)方法。我想看看是否有其他解决方案(保持该方法静态)。例如,通过代码重构不,没有。您可以将该方法更改为非静态,使用PowerMock(不推荐),或者您可以创建一个委托非实例方法并对其进行模拟(通常在使用遗留代码时解决)。
非实例方法?这是什么意思<代码>非实例
==
静态
?打字,一种意味着
实例
方法,即
非静态
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() {
          //...
       }
    });
  }
}