簡體   English   中英

如何使用JUnit,EasyMock或PowerMock模擬靜態最終變量

[英]How to mock a static final variable using JUnit, EasyMock or PowerMock

我想模擬靜態最終變量以及使用JUnit,EasyMock或PowerMock模擬i18n類。 我怎么做?

嘲弄變量的東西嗎? 我會稱之為重新分配。 我不認為EasyMock或PowerMock會為您提供一種簡單的方法來重新分配static final字段(這聽起來像一個奇怪的用例)。

如果你想這樣做,你的設計可能有問題:如果你知道一個變量可能有另一個值,即使是為了測試目的,也要避免static final (或更常見的全局常量)。

無論如何,您可以使用反射來實現(來自: 使用反射來更改靜態最終的File.separatorChar以進行單元測試? ):

static void setFinalStatic(Field field, Object newValue) throws Exception {
    field.setAccessible(true);

    // remove final modifier from field
    Field modifiersField = Field.class.getDeclaredField("modifiers");
    modifiersField.setAccessible(true);
    modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);

    field.set(null, newValue);
}

使用方法如下:

setFinalStatic(MyClass.class.getField("myField"), "newValue"); // For a String

拆除時不要忘記將字段重置為原始值。

它可以使用PowerMock功能的組合來完成。 使用@PrepareForTest({...})注釋進行靜態@PrepareForTest({...})你的字段(我使用Mockito.mock(...) ,但你可以使用等效的EasyMock結構),然后使用WhiteBox.setInternalState(...)設置你的值WhiteBox.setInternalState(...)方法。 請注意,即使您的變量是private這也會有效。

有關擴展示例,請參閱此鏈接: http//codyaray.com/2012/05/mocking-static-java-util-logger-with-easymocks-powermock-extension

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM