我有一个使用 Spring Boot 1.5.21 编写的库模块。
该库有一个@Service
带有注释的方法,@PreAutorize
仅允许具有ADMIN权限的用户执行某些操作,例如delete。
然后我有一个使用该库的 Spring Boot 应用程序。如果我运行该应用程序并手动测试它,它就可以工作。只有管理员可以删除。我想为它写测试。
我正在考虑为模块和主应用程序编写单独的测试。在我的模块中,我可以成功地对操作进行单元测试。但是我在测试时遇到了麻烦@PreAuthotize
,因为模块中不存在安全上下文,而是在主应用程序中。有没有办法在模块中测试该注释,而不是在主应用程序中?
我的库的相关代码:
@Service
public class MyService {
@PreAuthorize("hasAuthority('ADMIN')")
public void delete (long id){
.....
}
}
@RunWith(SpringRunner.class)
public class MyServiceTest {
private MyService service;
@Test
@WithAnonymousUser
public void deleteShouldFailIfAnonymous() {
... Verify exception thrown
}
@Test
@WithMockUser(authorities = 'USER')
public void deleteShouldFailIfNotAdmin() {
... Verify exception thrown
}
@Test
@WithMockUser(authorities = 'ADMIN')
public void deleteShouldPass() {
... Should pass
}
}
我正在尝试添加@EnableGlobalMethodSecurity(prePostEnabled = true)
但没有运气。如前所述,SecurityConfiguration 加载在主应用程序中,它不存在于库模块中。
我可以@PreAuthorize
在模块中测试还是应该将其移动到主应用程序?如果可能的话,我想把它放在模块中。或者也许我可以创建一个仅用于测试的上下文,但不知道该怎么做。