Java 在powermock的静态方法中模拟静态方法

Java 在powermock的静态方法中模拟静态方法,java,spring-boot,mockito,powermock,Java,Spring Boot,Mockito,Powermock,我有一个静态方法,它查找当前userSession对象并返回一个字符串 public static String getCurrentUser() { UserSession userSession = buildUserSession(); String responseString = userSession.getUsername(); return responseString; } 为此,我调用一个私有静态方法来实例化会

我有一个静态方法,它查找当前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;
    }
我猜你想测试getCurrentUser和mock buildUserSession

不是编写PowerMockito.whenSecurityUtils.class,而是编写buildUserSession.thenReturnuserSession

你应该打电话

PowerMockito.whenSecurityUtils.buildUserSession.thenReturnuserSession

在when子句中,您必须指定mock方法,就像您在没有mock的情况下调用它一样。我猜您想测试getCurrentUser,并据此模拟buildUserSession

不是编写PowerMockito.whenSecurityUtils.class,而是编写buildUserSession.thenReturnuserSession

你应该打电话

PowerMockito.whenSecurityUtils.buildUserSession.thenReturnuserSession

在when子句中,您必须指定模拟的方法,就像您在没有模拟的情况下调用它一样:

public static String getCurrentUser()

private static UserSession buildUserSession()
最后:

PowerMockito.mockStatic(SecurityUtils.class);
您告诉PowerMockito模拟SecurityUtils中的所有静态方法。然后你想测试当你调用其中一个方法时会发生什么

提示:当您转到mockStaticSecurityUtils.class时,该类上的所有静态方法都将被擦除

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

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

换句话说:学习如何编写易于测试的代码。这样,您就不需要强大的PowerMockito锤子来解决难以测试代码的问题。

这里:

public static String getCurrentUser()

private static UserSession buildUserSession()
最后:

PowerMockito.mockStatic(SecurityUtils.class);
您告诉PowerMockito模拟SecurityUtils中的所有静态方法。然后你想测试当你调用其中一个方法时会发生什么

提示:当您转到mockStaticSecurityUtils.class时,该类上的所有静态方法都将被擦除

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

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


换句话说:学习如何编写易于测试的代码。这样,您就不需要强大的PowerMockito锤子来解决难以测试代码的问题。

buildUserSession方法是一种私有方法。出于这个原因,我使用了when子句表示法。如果它是private,那么使用securityutilsin间谍而不是mock。buildUserSession方法是private方法。出于这个原因,我使用了when子句表示法。如果它是私有的,那么就使用securityutilsi而不是mock。据我所知,您可以避免像瘟疫一样的静态mock。当您编写自己的代码时,请编写易于测试的代码。如果没有PowerMockito它是不可测试的,那么你就做错了。我支持这一点。如果您的测试用例依赖于静态方法的结果,那么这就暗示了糟糕的设计。只有当方法不依赖于程序的状态时,才应将其声明为静态方法。由于主体、角色等发生变化,用户会话也会发生变化。那么为什么您的方法被声明为静态的呢?据我所知,您避免了像瘟疫一样的静态模拟。当您编写自己的代码时,请编写易于测试的代码。如果没有PowerMockito它是不可测试的,那么你就做错了。我支持这一点。如果您的测试用例依赖于静态方法的结果,那么这就暗示了糟糕的设计。只有当方法不依赖于程序的状态时,才应将其声明为静态方法。由于主体、角色等发生变化,用户会话也会发生变化。那么为什么您的方法被声明为静态的呢?这确实是非常有用的见解。我以前对静态方法的使用提出过质疑。虽然我认为测试这些静态比较困难,但我保留了这些方法,因为它们属于一个管理用户会话的类,并且我希望能够在没有烦人的类实例的情况下访问它们。我必须做出选择,要么改变我的体系结构,使其更易于测试,要么尝试使测试适应它。我想我会重新考虑的。谢谢你。@GabrielPimenta非常欢迎你。准确地说:尽管静态在Java中有点反常,但它仍然是一个合法的语言元素。但使用时应谨慎,正如所说:一旦它妨碍了你。。。不要使用它,或者以不影响单元测试能力的方式使用它。据我所知,用Mockito测试静态方法是不可能的。因此,每当我编写一个静态方法时,我都必须使用PowerMockito。如果使用Pow
正如你所描述的那样,埃尔莫基托是一个不太好的练习,我不应该认为静态方法不是一个很好的练习吗?小心。除非使用PowerMockito或JMockit,否则不能模拟静态方法。这并不意味着你不能测试它们。嘲弄是一种手段,你有时不得不求助于。。。编写测试。所以,要准确地说出你所用的词;-。。。您可以为静态方法编写完美的单元测试。。。只要这些静态方法可以在单元测试设置中被调用!我现在明白了。我仍然是Java的初学者,但多亏了您和@Panzerkroete,讨论对我非常有用。非常有用的见解。我以前对静态方法的使用提出过质疑。虽然我认为测试这些静态比较困难,但我保留了这些方法,因为它们属于一个管理用户会话的类,并且我希望能够在没有烦人的类实例的情况下访问它们。我必须做出选择,要么改变我的体系结构,使其更易于测试,要么尝试使测试适应它。我想我会重新考虑的。谢谢你。@GabrielPimenta非常欢迎你。准确地说:尽管静态在Java中有点反常,但它仍然是一个合法的语言元素。但使用时应谨慎,正如所说:一旦它妨碍了你。。。不要使用它,或者以不影响单元测试能力的方式使用它。据我所知,用Mockito测试静态方法是不可能的。因此,每当我编写一个静态方法时,我都必须使用PowerMockito。如果使用PowerMockito,如你所描述的那样,是一个不太好的练习,我不应该认为静态方法不是一个好的练习吗?小心。除非使用PowerMockito或JMockit,否则不能模拟静态方法。这并不意味着你不能测试它们。嘲弄是一种手段,你有时不得不求助于。。。编写测试。所以,要准确地说出你所用的词;-。。。您可以为静态方法编写完美的单元测试。。。只要这些静态方法可以在单元测试设置中被调用!我现在明白了。我仍然是Java的初学者,但多亏了您和@Panzerkroete,讨论对我非常有用。