【发布时间】:2020-09-24 18:23:52
【问题描述】:
我有一个使用 Spring Boot 1.5.21 编写的库模块。
该库有一个@Service,其中一些方法用@PreAutorize 注释,只允许具有ADMIN 权限的用户执行某些操作,例如delete。 p>
然后我有一个使用该库的 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 还是应该将其移至主应用程序?如果可能的话,我想把它放在模块中。或者也许我可以创建一个仅用于测试的上下文,但不知道该怎么做。
【问题讨论】:
-
您是如何在测试用例中获取服务实例的?
-
我只是在测试的 setup() 方法中创建它的一个新实例,比如
service = new MyService()
标签: java spring-boot spring-security spring-security-test