Издевательство над статическим методом Широ в SecurityUtils с помощью PowerMock

#java #unit-testing #easymock #powermock #shiro

#java #модульное тестирование #easymock #powermock #сиро

Вопрос:

Всем привет, я пытаюсь издеваться над статическим методом из пакета 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?

Приветствия

Комментарии:

1. Проблема не в том, что вы ожидали вызова один раз, но затем вызвали его дважды? Попробуйте добавить .times(2) в конец ожидания для getSubject()

2. добавление этого на самом деле ничего не делает для меня. У меня есть 2 вызова здесь, чтобы вызвать исключение, поскольку оно работает в первый раз, но не во второй

Ответ №1:

Это решило мою проблему

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

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