java - 在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);
}
}
解决方案
这里:
public static String getCurrentUser()
private static UserSession buildUserSession()
最后:
PowerMockito.mockStatic(SecurityUtils.class);
您告诉 PowerMockito 模拟SecurityUtils 中的所有静态方法。然后你想测试当你调用这些方法之一时会发生什么?
提示:你去那个类的mockStatic(SecurityUtils.class)
所有静态方法的那一刻都被“擦除”了。
因此:您不能丢弃类上的所有静态方法......然后假设您可以测试其中一个!
除此之外:一旦静态进入您进行单元测试的方式,那么转向 PowerMock(ito) 就是错误的答案。相反,您应该重新考虑您的设计,以便可以在没有 PowerMock(ito) 的情况下对其进行测试。
换句话说:学习如何编写易于测试的代码。那么您就不需要大的 PowerMock(ito) 锤子来解决难以测试的代码强加给您的问题。
推荐阅读
- javascript - 我如何将 express-fileupload 与 fetch 一起使用?
- listview - Xamarin Forms - 刷新 ListView 时连接到远程数据库
- python - 奇怪的行为,为什么不能在函数中使用最外层的变量?
- reactjs - 对象中的打字稿类型值
- php - 将数据从表单发布到控制器时出现 MethodNotAllowedHttpException
- javascript - 如何验证 javascript 使用的 REST API(因为代码是公开的)
- python - Python翻译功能
- java - 多处理 kafka 消息
- spring - Spring AMQP:如何知道消息生成 AmqpRejectAndDontRequeueException
- dart - Flutter Firebase Analytics 未记录事件