Юнит-тест Apache shiro с checkPermission проходит независимо от разрешения на заглушку - PullRequest
0 голосов
/ 31 мая 2018

Запуск весенней загрузки 1.5.12 с Shiro starter 1.4.0

Попытка написать некоторые модульные тесты для проверки статического класса, который проверяет разрешения с помощью checkPermission интерфейса Subject.

Я издеваюсь над темой shiro и заглушаю метод isPermitted, чтобы он возвращал false для определенной строки разрешения ... но по какой-то причине он проходит, когда Subject.checkPermission выполняется.

Subject subjectUnderTest = mock(Subject.class);
when(subjectUnderTest.isAuthenticated()).thenReturn(true);
when(subjectUnderTest.isPermitted(eq("review:edit:regional"))).thenReturn(false);
setSubject(subjectUnderTest);
subjectUnderTest.checkPermission("review:edit:regional");

Я довольно новыйв Mockito, но в этом случае ожидалось, что AuthorizationException будет выдано checkPermission с учетом того, что заглушка isPermitted возвращает false.

Если я изменю реализацию на использование isPermitted, тогда тест будет запущен, как и ожидалось ... но текущая реализация использует checkPermission...

1 Ответ

0 голосов
/ 04 июня 2018

Метод checkPermission() интерфейса Subject будет вызывать isPermitted() не для самого себя, а для абстрактного AuthorizingRealm.Цепочка вызовов для checkPermission() выглядит следующим образом:

Subject.checkPermissions()->
    DelegatingSubject.checkPermissions()->
        Authoriser.checkPermission()->
            AuthorizingRealm.checkPermission()->
            AuthorizingRealm.isPermitted()

Следовательно, насмешка isPermitted() на Subject не будет иметь никакого эффекта, поскольку checkPermission() никогда не вызовет ее на этом объекте.Чтобы достичь ожидаемого поведения, вы должны смоделировать метод в AuthorizingRealm или, альтернативно, в AuthorizingSecurityManager вызовы incase для вашего SecurityManager доступны при тестировании.

...