Мокательный статический метод внутри статического метода на powermock - PullRequest
1 голос
/ 14 июня 2019

У меня есть статический метод, который ищет текущий объект userSession и возвращает строку.

public static String getCurrentUser()
    {
        UserSession userSession = buildUserSession();
        String responseString = userSession.getUsername();
        return responseString;
    }

Для этого я вызываю закрытый статический метод, чтобы создать экземпляр объекта сеанса и вернуть его первому методу.,Метод buildUserSession многократно используется во многих других методах.

private static UserSession buildUserSession()
    {
        Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        UserDetails userDetails = (UserDetails) principal;
        String[] rolesArray = ConversionUtils.convertObjectArrayToStringArray(userDetails.getAuthorities().toArray());
        List<String> rolesList = Arrays.asList(rolesArray);
        UserSession userSession = new UserSession();
        userSession.setRoles(rolesList);
        userSession.setUsername(userDetails.getUsername());
        return userSession;
    }

Из того, что я понимаю, на данный момент статический метод mocking лучше всего выполнять с помощью mockito + powermock.Хотя мне не удается заставить эту настройку работать, когда у меня есть статический метод внутри статического метода, который я хочу протестировать.Можете ли вы помочь мне с этим модульным тестом?

РЕДАКТИРОВАТЬ: я хочу проверить getCurrentUser () и и макет buildUserSession ().

@RunWith(PowerMockRunner.class)
@PrepareForTest(SecurityUtils.class)
public class SecurityUtilsTests {

    @Test
    public void getCurrentUserTest() throws Exception {
        // when
        String expected = "testUsername";
        UserSession userSession = new UserSession();
        userSession.setUsername(expected);
        PowerMockito.mockStatic(SecurityUtils.class);
        PowerMockito.when(SecurityUtils.class, "buildUserSession").thenReturn(userSession);
        String actual = SecurityUtils.getCurrentUser();
        assertThat(actual).isEqualTo(expected);
    }
}

Ответы [ 2 ]

2 голосов
/ 21 июня 2019

Здесь:

public static String getCurrentUser()

private static UserSession buildUserSession()

И, наконец:

PowerMockito.mockStatic(SecurityUtils.class);

Вы указываете PowerMockito высмеивать все статические методы в SecurityUtils.И затем вы хотите проверить что происходит, когда вы вызываете один из этих методов?

Подсказка: в тот момент, когда вы отправите mockStatic(SecurityUtils.class) все статические методы в этом классе,«стерты».

Таким образом: вы не можете выбросить все статические методы класса ... чтобы потом предположить, что вы можете протестировать один из них!

Помимо этого: как только static встает на путь выполнения модульного тестирования, а затем переключение на PowerMock (ito) является неправильным ответом.Вместо этого вам следует переосмыслить свой дизайн, чтобы можно было протестировать его без PowerMock (ito).

Другими словами: научитесь писать простой в тестировании код.Тогда вам не нужен большой молоток PowerMock (ito) для решения проблем, которые навязывает вам сложный для тестирования код.

1 голос
/ 14 июня 2019

Полагаю, вы хотите проверить getCurrentUser() и тем самым высмеять buildUserSession()?

Вместо записи PowerMockito.when(SecurityUtils.class, "buildUserSession").thenReturn(userSession);

вам следует позвонить

PowerMockito.when(SecurityUtils.buildUserSession()).thenReturn(userSession);

В пункте when () вы должны указать смоделированный метод точно так же, как вы бы назвали его без насмешки

...