在powermock的静态方法中模拟静态方法

Mocking static method inside static method on powermock

我有一个查找当前 userSession 对象和 return 字符串的静态方法。

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

为此,我调用了一个私有静态方法来实例化会话对象,并将其 return 传递给第一个方法。 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;
    }

据我了解,静态方法模拟最好用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);
    }
}

我猜你想测试 getCurrentUser() 并特此模拟 buildUserSession()?

而不是写作PowerMockito.when(SecurityUtils.class, "buildUserSession").thenReturn(userSession);

你应该打电话给

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

when() 子句中,您必须指定模拟方法,就像您在没有模拟的情况下调用它一样准确

这里:

public static String getCurrentUser()

private static UserSession buildUserSession()

最后:

PowerMockito.mockStatic(SecurityUtils.class);

您告诉 PowerMockito 在 SecurityUtils 中模拟 all 静态方法。然后您想 测试 当您调用这些方法之一时会发生什么?

提示:你去的那一刻 mockStatic(SecurityUtils.class) 所有 class 上的静态方法是 "erased"。

因此:您不能丢弃 class 上的所有静态方法...然后假设您可以测试其中之一!

除此之外:一旦 static 进入您进行单元测试的方式,然后转向 PowerMock(ito) 是 错误的 回答。相反,您应该重新考虑您的设计,以便您可以在没有 PowerMock(ito) 的情况下对其进行测试。

换句话说:学习如何编写 easy-to-test 代码。那么你不需要大的 PowerMock(ito) 锤子来解决 hard-to-test 代码强加给你的问题。