PowerMock私有方法依赖于私有方法



我想使用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){..}
}

现在,将方法公开并且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);
}

最新更新