![](/img/trans.png)
[英]How to Mock an object which is created in the class under test in Mockito
[英]How to inject the mock of an object which is declared as private static in the class under test in java?
我有一個類ManageUser,如下所示:
public class ManageUser {
private static UserBO gUserBO = new UserBO();
public String method1() {
gUserBO.callSomeFunction();
gUserBO.callSomeOtherFunction();
}
}
現在,我有一個測試類,我要在其中測試method1(),並且由於方法callSomeFunction()和callSomeOtherFunction()最終進行數據庫調用,因此我想模擬對這些方法的調用。 由於ManageUser中的對象是靜態的,因此無法通過模擬來做到這一點。 我該如何進行? 我是Junit和Mockito的新手,似乎找不到相關的答案。
嘗試使用Power Mockito:
@RunWith(PowerMockRunner.class)
@PrepareForTest({ManageUser.class})
public class ClassInTest {
@Test
public void testStatic() {
ManageUser mUser = new ManageUser();
Field field = PowerMockito.field(ManageUser.class, "gUserBO");
field.set(ManageUser.class, mock(UserBO.class));
...
}
}
您“無法通過使用模擬做到這一點”,因為您的類設計不良。 作為一種解決方法,您可以使用PowerMock (如@SK所建議的)模擬靜態字段,但這只會抑制類的實際問題。
更好地把握機會並改進代碼以提高可測試性和可擴展性:
步驟1:為您的類UserBO
創建一個接口,並使其實現。
public interface UserService {
void callSomeFunction();
void callSomeOtherFunction();
}
public class UserBO implements UserService { ... }
步驟2:更改您的類ManageUser
以通過構造函數獲取UserService
任何實現。
public class ManageUser {
private final UserService userService;
public ManageUser(UserService userService) {
this.userService = userService;
}
public String method1() {
userService.callSomeFunction();
userService.callSomeOtherFunction();
}
}
步驟3:更改類ManageUser
的調用方以提供UserService
。
所以代替
ManageUser manager = new ManageUser();
采用
ManageUser manager = new ManageUser(new UserBO());
步驟4:現在,您可以輕松地在測試中模擬UserService
並使用該模擬構造ManageUser
。
這種設計還使DI框架(例如Spring)能夠注入 (或自動裝配 )組件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.