如何對Java單例模式進行mock


最近剛開始轉行到Java編程,項目使用的是Junit4框架。其中遇到了採用單例模式(餓漢)實現的Java代碼,那麼如何對該類中的方法進行模擬呢?由於該模式下全部的共有方法都是經過獲取該類的靜態私有實例來調用類中的共有方法,這就須要對該類的靜態私有實例對象來模擬。通過研究發現,能夠使用Whitebox類來幫助咱們模擬該靜態私有實例對象。
html


Java源代碼:java


public class HelloWorld {
   private static HelloWorld instance = new HelloWorld();

   private HelloWorld() {}

   public static HelloWorld getInstance() {return instance;}

   public void say() {
       System.out.println("Hello World!");
   }
}

public class HelloWorld {
   private static HelloWorld instance = new HelloWorld();

   private HelloWorld() {}

   public static HelloWorld getInstance() {return instance;}

   public void say() {
       System.out.println("Hello World!");
   }
}


測試代碼:編程


public class HelloWorldAppTest {
   private HelloWorldApp helloWorldApp;

   @Before
   public void setUp() throws Exception {
       helloWorldApp = new HelloWorldApp();
   }

   @Test
   public void sayHelloWorld() throws Exception {
       HelloWorld instanceMock = PowerMockito.mock(HelloWorld.class);
       Whitebox.setInternalState(HelloWorld.class, "instance", instanceMock);

       Mockito.doNothing().when(instanceMock).say();

       helloWorldApp.sayHelloWorld();
       Mockito.verify(instanceMock).say();
   }
}


要注意的是必須使用"org.powermock.reflect.whitebox",關於該類的詳細用法可參考http://static.javadoc.io/org.powermock/powermock-reflect/1.6.4/org/powermock/reflect/Whitebox.html框架


不能使用「org.mockito.internal.util.reflection.Whitebox」,這個類不支持對私有字段進行模擬。

ide

相關文章
相關標籤/搜索