#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();