Unit testing 使用checkPermission的ApacheShiro单元测试通过,而不考虑存根权限
带Shiro starter 1.4.0的运行弹簧护套1.5.12 尝试编写一些单元测试来测试静态类,该类使用Subject接口的checkPermission检查权限 我正在模拟shiro主题,并将isPermitted方法存根为特定权限字符串返回false。。。但由于某些原因,它在执行Subject.checkPermission时会通过Unit testing 使用checkPermission的ApacheShiro单元测试通过,而不考虑存根权限,unit-testing,shiro,Unit Testing,Shiro,带Shiro starter 1.4.0的运行弹簧护套1.5.12 尝试编写一些单元测试来测试静态类,该类使用Subject接口的checkPermission检查权限 我正在模拟shiro主题,并将isPermitted方法存根为特定权限字符串返回false。。。但由于某些原因,它在执行Subject.checkPermission时会通过 Subject subjectUnderTest = mock(Subject.class); when(subjectUnderTest.isAuthe
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相当陌生,但在本例中,如果isPermitted存根返回false,则希望checkPermission抛出AuthorizationException
如果我将实现更改为使用isPermitted,那么测试将按预期运行..但是当前实现使用的是checkPermission…接口的方法
checkPermission()
将不会在自身上调用isPermitted()
,而是在摘要上调用。checkPermission()
的调用链如下所示:
Subject.checkPermissions()->
DelegatingSubject.checkPermissions()->
Authoriser.checkPermission()->
AuthorizingRealm.checkPermission()->
AuthorizingRealm.isPermitted()
因此,在
主题上模拟ispermited()
将无效,因为checkPermission()
将永远不会在此对象上调用它。要实现预期的行为,您必须在AuthorizingRealm
或AuthorizingSecurityManager
上模拟该方法,以防对SecurityManager
的调用在测试中可用。谢谢。我在玩被嘲笑的主题。然后进入了mockito的无效存根方法。。因此,这里的正确方法似乎是使用doNothing和doThrow模拟checkPermission pass和failure测试。其中doThrow()将抛出shiro AuthorizationException。