Unit testing 单元测试:使用mockito或powermock模拟工厂方法

Unit testing 单元测试:使用mockito或powermock模拟工厂方法,unit-testing,mockito,powermock,Unit Testing,Mockito,Powermock,我有一个具有以下结构的类 public class MyClass{ private MyClass(){ } public static MyClass getInstance(){ return new MyClass(); } //some instance method. } 使用powermock,我可以模拟“MyClass”,如下所示 PowerMock.mockStaticClass(Myclass.class); 但当有人在My

我有一个具有以下结构的类

public class MyClass{
   private MyClass(){
   }

   public static MyClass getInstance(){
       return new MyClass();
   }

   //some instance method.
}
使用powermock,我可以模拟“MyClass”,如下所示

PowerMock.mockStaticClass(Myclass.class);
但当有人在MyClass上调用getInstance()时,我无法返回任何有效对象。 i、 例如,如何填写以下空白

Mock.when(MyClass.getInstance()).thenReturn(<What do I return here>);
Mock.when(MyClass.getInstance()).thenReturn();
返回值是必需的,因为我需要存根/验证一些实例方法

有人能帮我解决这个问题吗?

您可以模拟实例和静态方法,并使模拟静态方法返回对模拟实例的引用。比如:

MyClass mock = PowerMock.mockClass(MyClass.class);

PowerMock.mockStaticClass(MyClass.class);
Mock.when(MyClass.getInstance()).thenReturn(mock);

(我从未使用过PowerMock,因此语法可能有点错误……

那么你想做什么?您可以创建真实类的实例,也可以创建模拟。你说你“无法返回任何有效对象”-什么阻止了你?我不能返回对象,因为构造函数是私有的。啊,我明白了。。。但你是在试图回击一个嘲笑者吗?如果您尝试
PowerMock.mockClass
,会发生什么情况?@Jon Skeet我对您建议的方法有疑问。在我正在测试的方法中,我调用了
MyClass.getInstance()
方法,并从
getInstance()
返回的对象调用了实例方法。在测试中,我没有存根
getInstance()
。我只是存根了实例方法。当被测方法实际调用
MyClass.getInstance()
时会发生什么?我不是建议替换
mockStaticClass
调用-我是建议从
thenReturn
返回的值应该是实例方法的模拟值。