【问题标题】:PowerMock in JUnitJUnit 中的 PowerMock
【发布时间】:2016-05-17 09:37:57
【问题描述】:

您能帮我为该代码定义 PowerMock:

    String role = "ROLE_WARP_PUBLISH_PRIVATE";

    Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
    Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();

    for (GrantedAuthority auth : authorities)
    {
        if(auth.getAuthority().equals(role))
        {
            if (publishCheckbox == true)
            {
                getScenarioService().makePublic(scenarioVersionId);
            }
        }

    }

所以我知道我必须如何模拟getContext(),但是当调用此方法时我无法返回某些内容,所以我完全不知道如何模拟这几行。

感谢您的帮助

【问题讨论】:

  • 一般这类问题,你应该先试试谷歌。 Stack Overflow 是为了解决代码问题,而不是(我在这里也不是要冒犯)缺乏知识。如果您要提问,请查看How to Ask。谢谢。
  • 很遗憾我不能亲自帮助你,因为我对 java 一无所知 - 我只是在审查这个问题。
  • 这就是我目前发现的:Authentication authentication = Mockito.mock(Authentication.class); SecurityContext securityContext = Mockito.mock(SecurityContext.class); Mockito.when(securityContext.getAuthentication()).thenReturn(authentication); SecurityContextHolder.setContext(securityContext);
  • @Herrminator 从未将更多信息放入 cmets;而是更新问题。并且永远不要将代码放入 cmets。格式很重要。

标签: java unit-testing junit mockito powermock


【解决方案1】:

我的建议:忘记使用 PowerMock。

如果你必须模拟静态方法,那么围绕它构建你自己的小包装类。然后,为了测试,你的包装器可以返回 控制的东西;并用于生产用途;您的包装器只调用静态方法。

PowerMock 看起来可以解决许多问题;但迟早会导致更多问题。

说真的:如果您的设计只能使用 PowerMock 进行测试,这通常清楚地表明您的设计糟糕。所以:专注于修改被测代码;而不是将时间投入到像 PowerMock 这样弊大于利的工具上。

我花了无数个小时试图解决 PowerMock 问题;并且因为开始编写“更好地测试”生产代码......我已经编写了数百或数千个测试,而不再需要 PowerMock。

【讨论】:

  • 虽然我同意该声明,但我认为它不能回答问题。我认为这将是对实际答案的一个很好的脚注。
  • 很有趣;我不止一次就类似的问题给出了类似的答案;更重要的是:不止一次,这个人最终接受了我的回答。因为,有时人们意识到他们正面临一个 XY 问题;我给了他们“Y”的答案……而且这些信息比得到“X”的答案更有价值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-17
  • 1970-01-01
  • 2015-12-12
相关资源
最近更新 更多