[英]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等)。 這里最大的問題是您的代碼編寫不容易測試。 嘗試做一些重構,例如:
static
。 所以你的代碼看起來像
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.