具有 checkPermission 的 Apache shiro 单元测试通过,而不管存根权限如何

Apache shiro unit test with checkPermission passes regardless of stubbed permission

运行 spring 使用 Shiro 启动器 1.4.0 启动 1.5.12

正在尝试编写一些单元测试来测试使用 Subject 接口的 checkPermission 检查权限的静态 class。

我正在嘲笑 shiro 主题并将 isPermitted 方法存根为 return 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 的新手,但在这种情况下,我希望 checkPermission 抛出 AuthorizationException 给定 isPermitted 存根 returning false。

如果我将实现更改为使用 isPermitted,则测试会按预期运行。但当前的实现正在使用 checkPermission...

Subject interface will not call isPermitted() on itself but on the abstract AuthorizingRealm 的方法checkPermission()checkPermission() 的调用链如下所示:

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

因此,在 Subject 上模拟 isPermitted() 将没有任何效果,因为 checkPermission() 永远不会在此对象上调用它。要实现预期的行为,您必须在 AuthorizingRealmAuthorizingSecurityManager 上模拟该方法,以防对您的 SecurityManager 的调用在测试中可用。