在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 代码强加给你的问题。
我有一个查找当前 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 代码强加给你的问题。