2016-04-02 97 views
0

我有一個工具類,這是一個最終的類。在那裏我用注射器注射LOGGER。使用Powermock嘲弄靜態私有最終變量?

public final class Utilities { 

    @Inject 
    private static Logger.ALogger LOGGER; 

    private Utilities() { 
     //this is the default constructor. so there is no implementation 
    } 

    public static String convertToURl(string input){ 
     try{ 
      //do some job 
      }catch(IllegalArgumentException ex){ 
      LOGGER.error("Invalid Format", ex); 
      } 
    } 

} 

雖然我爲這種方法編寫單元測試,但我必須模擬LOGGER,否則會拋出空指針異常。我怎樣才能嘲笑這個LOGGER而不創建這個類的實例。我試圖對變量進行白盒操作。但它只適用於實例?

+0

不[注射到靜態字段(http://stackoverflow.com/questions/19225179/is-it-possible-to-inject-a-cdi-bean-into-a-static-variable -in-java-ee-6)爲你工作? – fracz

+0

默認情況下,guice不允許通過設計進行靜態注入。但我們可以請求[this](http://stackoverflow.com/questions/28513147/guice-injection-in-static-variable) – Burusothman

+0

我不知道。我還沒有使用過,但是如果它能夠注入靜態字段,也許可以用它在單元測試中注入一個記錄器模擬? – fracz

回答

1

此代碼正常工作。要設置靜態字段,您需要將類傳遞給org.powermock.reflect.Whitebox.setInternalState。請確保您使用包org.powermock.reflect中的PowerMock的課程,因爲Mockito的課程名稱相同。

@RunWith(PowerMockRunner.class) 
public class UtilitiesTest { 

    @Mock 
    private Logger.ALogger aLogger; 

    @Before 
    public void setUp() throws Exception { 

     MockitoAnnotations.initMocks(this); // for case them used another runner 
     Whitebox.setInternalState(CcpProcessorUtilities.class, "LOGGER", aLogger); 
    } 

    @Test 
    public void testLogger() throws Exception { 
     Utilities.convertToURl(""); 
     verify(aLogger).error(eq("Invalid Format"), any(IllegalArgumentException.class)); 
    } 
} 
+0

它的工作原理。乾杯! – Burusothman

+0

它需要更新。白盒不再使用。 – user447607

+0

@ user447607你是什麼意思的「不再使用」?該類仍然存在於PowerMock中並將保留。我沒有計劃將其刪除。可能是你的意思是有另一種方式來做到這一點! –