如何使用Mockito / Powermock模拟枚举单例类?
我不确定如何模拟枚举单例类。
public enum SingletonObject{ INSTANCE; private int num; protected setNum(int num) { this.num = num; } public int getNum() { return num; }
我想在上面的例子中存根getNum(),但我无法弄清楚如何模拟实际的SingletonObject类。 我认为使用Powermock准备测试会有所帮助,因为枚举本身就是最终的。
//... rest of test code @Test public void test() { PowerMockito.mock(SingletonObject.class); when(SingletonObject.INSTANCE.getNum()).thenReturn(1); //does not work }
这是使用PowerMockMockito 1.4.10和Mockito 1.8.5。
如果你想要删除INSTANCE返回的内容,你可以这样做,但它有点讨厌(使用reflection和字节码操作)。 我使用PowerMock 1.4.12 / Mockito 1.9.0创建并测试了一个包含三个类的简单项目。 所有课程都在同一个课程中。
SingletonObject.java
public enum SingletonObject { INSTANCE; private int num; protected void setNum(int num) { this.num = num; } public int getNum() { return num; } }
SingletonConsumer.java
public class SingletonConsumer { public String consumeSingletonObject() { return String.valueOf(SingletonObject.INSTANCE.getNum()); } }
SingletonConsumerTest.java
import static org.junit.Assert.*; import static org.powermock.api.mockito.PowerMockito.*; import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import org.powermock.reflect.Whitebox; @RunWith(PowerMockRunner.class) @PrepareForTest({SingletonObject.class}) public class SingletonConsumerTest { @Test public void testConsumeSingletonObject() throws Exception { SingletonObject mockInstance = mock(SingletonObject.class); Whitebox.setInternalState(SingletonObject.class, "INSTANCE", mockInstance); when(mockInstance.getNum()).thenReturn(42); assertEquals("42", new SingletonConsumer().consumeSingletonObject()); } }
对Whitebox.setInternalState
的调用将INSTANCE
替换为您可以在测试中操作的模拟对象。