簡體   English   中英

PowerMock私有方法依賴私有方法

[英]PowerMock private method rely on private method

我想使用Powermock測試一個私有方法(一個),但是這個私有方法依賴於另一個私有方法(兩個)。

因此,我不得不模擬其他私有方法。 但是,當我調試它時,事實證明私有方法之一沒有調用模擬的私有方法(兩個),並且如果我運行而不是調試它會拋出異常:

預計有1個符合條件的記錄,2個記錄。

private int getCurrentLocaleID(WebIServerSession currentSession, String preferenceName) {
    String prefLocaleID = getUserPreference(currentSession, preferenceName);
    int lcid;

    if (HTTPHelper.isDefaultLocale(prefLocaleID)) {
        prefLocaleID = _appContext.getBrowserHeaderLocaleId();
    }
    try {
        lcid = Integer.parseInt(prefLocaleID);
    } catch (NumberFormatException nfe) {
        lcid = DEFAULT_LCID; // default behavior from old session manager
    }
    return lcid;
}

@Test
public void getCurrentLocaleID() throws Exception {
    PowerMockito.mockStatic(HTTPHelper.class);
    WebAppSessionManagerImpl webAppSessionMangerImpl2 = PowerMockito.spy(new WebAppSessionManagerImpl(appConext));
    given(HTTPHelper.isDefaultLocale("1")).willReturn(true);
    given(HTTPHelper.isDefaultLocale("0")).willReturn(false);
    given(appConext.getBrowserHeaderLocaleId()).willReturn("1");
    PowerMockito.doReturn("1").when(webAppSessionMangerImpl2, "getUserPreference", anyObject(), anyString());
    int result = Whitebox.invokeMethod(webAppSessionMangerImpl2, "getCurrentLocaleID", webIserverSession, "test");
    assertEquals(result, 1);
}

不要測試私有方法。 如果必須這樣做,則意味着您的班級表現超出預期,並且不符合“單一職責原則”。

這是在專業類中進行某些邏輯重構和隔離的機會,例如:

public class SpecializedClass{

    private Context context;

    public SpecializedClass(Context context){
         this.context = context;
    }

        public int getCurrentLocaleID(WebIServerSession currentSession, String preferenceName) {
        String prefLocaleID = getUserPreference(currentSession, preferenceName);
        int lcid;

        if (HTTPHelper.isDefaultLocale(prefLocaleID)) {
            prefLocaleID = _appContext.getBrowserHeaderLocaleId();
        }

        try {
            lcid = Integer.parseInt(prefLocaleID);
        } catch (NumberFormatException nfe) {
            lcid = DEFAULT_LCID; // default behavior from old session manager
        }
        return lcid;
    }

    String getUserPreference(Session session, String preferenceName){..}
}

現在取消方法public並將getUserPreference標記為包級別,測試將類似於:

@Test
public void getCurrentLocaleID() throws Exception {
    PowerMockito.mockStatic(HTTPHelper.class);

    SpecializedClass specializedClassSpy = Mockito.spy(new SpecializedClass(appConext));

    given(HTTPHelper.isDefaultLocale("1")).willReturn(true);
    given(HTTPHelper.isDefaultLocale("0")).willReturn(false);
    given(appConext.getBrowserHeaderLocaleId()).willReturn("1");

    Mockito.doReturn("1").when(specializedClassSpy)
       .getUserPreference(webIserverSession, "test");

    int result = specializedClassSpy.getCurrentLocaleID(webIserverSession, "test");

    assertEquals(result, 1);
}

暫無
暫無

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

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