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

时间:2019-06-14 01:40:19

标签: java spring-boot mockito 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;
    }

据我所知,静态方法模拟最好是用模仿+ 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 个答案:

答案 0 :(得分:2)

这里:

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 :(得分:1)

我猜您想测试getCurrentUser()并以此模拟buildUserSession()

代替编写PowerMockito.when(SecurityUtils.class, "buildUserSession").thenReturn(userSession);

您应该致电

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

when()子句中,您必须完全指定模拟方法,而无需模拟就可以调用它