我有一个静态方法,它查找当前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);
}
}
在这里:
public static String getCurrentUser()
private static UserSession buildUserSession()
最后:
PowerMockito.mockStatic(SecurityUtils.class);
你告诉PowerMockito模拟SecurityUtils中的所有静态方法。然后你想测试当你调用这些方法之一时会发生什么?
提示:当你mockStatic(SecurityUtils.class)
该类上的所有静态方法都被"擦除"的那一刻。
因此:你不能扔掉一个类上的所有静态方法......然后假设您可以测试其中之一!
除此之外:一旦静态进入你进行单元测试的方式,那么转向PowerMock(ito(就是错误的答案。相反,您应该重新考虑您的设计,以便在没有PowerMock(ito(的情况下对其进行测试。
换句话说:学习如何编写易于测试的代码。然后,您就不需要大的PowerMock(ito(锤子来解决难以测试的代码强加给您的问题。
你想测试getCurrentUser()
并特此模拟buildUserSession()
?
而不是写PowerMockito.when(SecurityUtils.class, "buildUserSession").thenReturn(userSession);
你应该打电话
PowerMockito.when(SecurityUtils.buildUserSession()).thenReturn(userSession);
在 when((-子句中,您必须指定模拟方法,就像在不模拟的情况下调用它