我有一个使用@Secured 注释的存储库方法。我正在尝试为此方法编写单元测试,但我的测试失败,因为我需要身份验证才能调用该方法。该方法本身恰好是 save() 方法。我调用该方法时得到的错误是:
org.springframework.security.authentication.AuthenticationCredentialsNotFoundException: An Authentication object was not found in the SecurityContext
我无法测试此方法,因为它需要身份验证,并且我无法保存用户进行身份验证(我正在使用 hsqldb),因为我需要调用此方法来保存。有关如何对使用 @secured 注释的方法进行单元测试或如何模拟身份验证的任何建议。
最佳答案
这取决于您要测试的内容。
如果您想在没有任何安全性的情况下测试应用程序的业务逻辑,您可以完全禁用安全性。假设您使用
SpringJunit4Runner
,您可以将安全配置放入单独的文件中,不要将其包含在@ContextConfiguration
中。如果你想测试授权(例如
@Secured
注释的正确工作),你可以直接访问SecurityContext
,绕过所有与身份验证相关的东西(在在这种情况下,您可以将身份验证配置放入单独的文件中,并且不要加载它):您只需将适当的
Authentication
对象放入SecurityContextHolder
:@Test public void myTest() { login(...); ... logout(); } private void login(...) { SecurityContextHolder.getContext().setAuthentication( new UsernamePasswordAuthenticationToken(...) ) } private void logout() { SecurityContextHolder.clearContext(); }
最后,如果要测试身份验证,可以使用包含测试数据的数据库运行测试。
关于spring - 模拟身份验证 Spring 安全性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8946497/