簡體   English   中英

Mockito:為什么在模擬類中不加載私有變量?

[英]Mockito: why private variable is not load in mock class?

public class Manager {
    private static url = SomeService.get();
    public void method() {
        ....
    }
}

@RunWith(MockitoJUnitRunner.class)
public class ManagerTest {
    @InjectMocks
    Manager manager = new Manager();
    @Test
    public void testMethod(){
         manager.method();
    }
}

當我嘗試InjectMock Manager類時,我發現靜態變量url為null,並且未在testMethod()初始化。 有人讓我知道我做錯了什么嗎?

在Mockito中, @InjectMocks沒有任何作用。 如果您自己沒有實例化它,它只是實例化帶注釋的系統測試(SUT),然后調用相應的setter將模擬注入到SUT中。

回到您的代碼,Mockito無法跳入以更改您的private static final SomeUrl url = SomeService.get();的行為private static final SomeUrl url = SomeService.get(); 只是您真正的SomeService.get()返回null

肯定有解決此問題的方法(通過使用Powermock或其他模擬庫,如JMockIt等)。 這里最大的問題是您的代碼編寫不容易測試。 嘗試做一些重構,例如:

  1. 在這種情況下,請避免使用static
  2. 避免在SUT中創建依賴項(您需要模擬)。 依賴項應該被注入。

所以你的代碼看起來像

public class Manager {
    private SomeUrl url;

    public void setUrl(SomeUrl url) { this.url = url; }

    public void method() {
        doSomethingOnUrl(this.url.getUrlString());
    }
}

@RunWith(MockitoJUnitRunner.class)
public class ManagerTest {
    @InjectMocks
    Manager manager = new Manager();

    @Mock
    SomeUrl mockUrl;   // <- This is the mock that will be injected by Mockito

    @Test
    public void testMethod(){
         // Given
         when(mockUrl.getUrlString()).thenReturn("SomeUrl");

         // When
         manager.method();

         // Then
         verify(mockUrl, times(1)).getUrlString();
    }
}

對,那是正確的。 由於Mock是動態代理,而url是類中定義的靜態變量。 多數情況下,模擬用於模擬預期的行為(方法),因此,如果要返回自己喜歡的某個URL,則可以在getUrl方法返回自己喜歡的URL時使用。 在您的方案中,您可以返回SomeService.get()

暫無
暫無

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

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