[英]PowerMock: Mocking static method that affect one test only
我的情況:
我想補充一個新的測試。 我需要模擬Service類的一個靜態方法X. 不幸的是,現有測試以某種方式使用這種靜態方法。
當我使用PowerMock模擬X方法時,其他測試失敗。 更重要的是,我不應該接觸其他測試。
有沒有機會只為一個測試模擬靜態方法? (使用PowerMock)。
提前致謝。
解決問題的最簡單方法是創建新的測試類並將測試放在那里。
您也可以使用隱藏在代碼中的接口后面的普通類來包裝此靜態類,並在測試中存根此接口。
您可以嘗試的最后一件事是使用以下方法在@SetUp方法中存儲靜態類的每個方法:
Mockito.when(StaticClass.method(PARAM))thenCallRealMethod();
你的測試中使用的特定方法:Mockito.when(Static.methodYouAreInterested(param))。thenReturn(value);
當然,這是可能的! 你可能遇到問題的唯一一次是你是否試圖同時測試多個線程...我在下面舉了一個如何做的例子。 請享用。
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.easymock.PowerMock;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import static org.easymock.EasyMock.*;
import static org.junit.Assert.*;
@RunWith(PowerMockRunner.class)
@PrepareForTest(IdGenerator.class)
public class TestClass {
@Test
public void yourTest()
{
ServiceRegistrator serTestObj = new ServiceRegistrator();
PowerMock.mockStatic(IdGenerator.class);
expect(IdGenerator.generateNewId()).andReturn(42L);
PowerMock.replay(IdGenerator.class);
long actualId = IdGenerator.generateNewId();
PowerMock.verify(IdGenerator.class);
assertEquals(42L,actualId);
}
@Test
public void unaffectedTest() {
long actualId = IdGenerator.generateNewId();
PowerMock.verify(IdGenerator.class);
assertEquals(3L,actualId);
}
}
識別TestClass
public class IdGenerator {
public static long generateNewId()
{
return 3L;
}
}
對於那些希望使用Mockito和PowerMocks實現這一目標的人來說,可以通過將@PrepareForTest
注釋添加到需要模擬值而不是測試類本身的測試本身來完成。
在這個例子中,讓我們假設SomeClass
有一個靜態函數( returnTrue()
)總是返回true
如下所示:
public class SomeClass {
public static boolean returnTrue() {
return true;
}
}
此示例顯示了我們如何在一個測試中模擬靜態調用,並允許原始功能在另一個測試中保持不變。
@RunWith(PowerMockRunner.class)
@Config(constants = BuildConfig.class)
@PowerMockIgnore({"org.mockito.*", "android.*"})
public class SomeTest {
/** Tests that the value is not mocked out or changed at all. */
@Test
public void testOriginalFunctionalityStays()
assertTrue(SomeClass.returnTrue());
}
/** Tests that mocking out the value works here, and only here. */
@PrepareForTest(SomeClass.class)
@Test
public void testMockedValueWorks() {
PowerMockito.mockStatic(SomeClass.class);
Mockito.when(SomeClass.returnTrue()).thenReturn(false);
assertFalse(SomeClass.returnTrue())
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.