java - 使用PowerMock模拟SecurityUtils中Shiro的静态方法

标签 java unit-testing easymock powermock shiro

大家好,我正在尝试模拟 Shiro 包中的静态方法

    org.apache.shiro.mgt.SecurityManager securityManager = EasyMock.createNiceMock(org.apache.shiro.mgt.SecurityManager.class);

    SecurityUtils.setSecurityManager(securityManager);

    PowerMock.mockStatic(SecurityUtils.class);

    EasyMock.expect(SecurityUtils.getSubject()).andReturn(null);
    PowerMock.replayAll(SecurityUtils.class);
    PowerMock.verify(SecurityUtils.class);

    Subject s = SecurityUtils.getSubject(); // this call returns null
    s = SecurityUtils.getSubject(); // this call fails with exception below

所以想法是,当在我的代码中调用 getSubject 时,我返回 null (我可能会将其更改为实际对象,但现在这是可行的。

当前的问题是我遇到异常

Usage is: expect(a.foo()).andXXX()
    at org.easymock.internal.MockInvocationHandler.invoke(MockInvocationHandler.java:42)
    at org.easymock.internal.ObjectMethodsFilter.invoke(ObjectMethodsFilter.java:94)
    at $Proxy10.createSubject(Unknown Source)
    at org.apache.shiro.subject.Subject$Builder.buildSubject(Subject.java:846)
    at org.apache.shiro.SecurityUtils.getSubject(SecurityUtils.java:56)
    at com.mypackage.services.logic.AbstractHibernateTest.abstractBefore(AbstractHibernateTest.java:94)
null

阅读本文后,解决方案应该是回复方法,但它不起作用。有没有人以前见过这个,或者有人对如何在 Shiro SecurityUtils 中模拟静态方法有任何建议吗?

干杯

最佳答案

这解决了我的问题

    SecurityUtils.setSecurityManager(EasyMock.createNiceMock(org.apache.shiro.mgt.SecurityManager.class));

    mockSubject = Mockito.mock(Subject.class);
    threadState = new SubjectThreadState(mockSubject);
    threadState.bind();

关于java - 使用PowerMock模拟SecurityUtils中Shiro的静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24520499/

相关文章:

c# - 尝试在新的 AppDomain 中加载混合的 C# 和 C++/CLI dll 时,从错误的 AppplicationBase 加载 DLL

java - 我如何测试注释处理器生成的无 .java 源?

java - EasyMock.andVoid() 的目的是什么?

ios - Cocoapods 库在单元测试期间未正确返回 isKindOfClass

java - "Method in Class cannot be applied to given types"的问题

java - 错误 :No such property: GradleVersion for class: JetGradlePlugin

java - 科拉兹序列 : Which number is the biggest?

java - EasyMock 捕获可变参数(集合)

java - 调用 EasyMock.expect() 时调用通过 EasyMock 和 Powermock 模拟的静态方法

java - 在java中搜索文件中的多个字符串