簡體   English   中英

如何在Java中的被測類中注入被聲明為private static的對象的模擬?

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

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