首页 > 解决方案 > 在powermock的静态方法中模拟静态方法

问题描述

我有一个静态方法来查找当前的 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;
    }

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

标签: javaspring-bootmockitopowermock

解决方案


这里:

public static String getCurrentUser()

private static UserSession buildUserSession()

最后:

PowerMockito.mockStatic(SecurityUtils.class);

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

提示:你去那个类的mockStatic(SecurityUtils.class) 所有静态方法的那一刻都被“擦除”了。

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

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

换句话说:学习如何编写易于测试的代码。那么您就不需要大的 PowerMock(ito) 锤子来解决难以测试的代码强加给您的问题。


推荐阅读