簡體   English   中英

PowerMock:模擬僅影響一個測試的靜態方法

[英]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.

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