vik*_*dat 14 spring spring-security
我有一个使用@Secured注释的存储库方法.我正在尝试为此方法编写单元测试,但我的测试失败,因为我需要身份验证来调用该方法.方法本身恰好是save()方法.我调用方法时得到的错误是:
org.springframework.security.authentication.AuthenticationCredentialsNotFoundException: An Authentication object was not found in the SecurityContext
Run Code Online (Sandbox Code Playgroud)
我无法测试此方法,因为它需要身份验证,我无法保存用户进行身份验证(我正在使用hsqldb),因为我需要调用此方法进行保存.有关如何对使用@secured注释的方法进行单元测试或如何模拟身份验证的任何建议.
axt*_*avt 15
这取决于你想要测试的内容.
如果您想在没有任何安全性的情况下测试应用程序的业务逻辑,则可以完全禁用安全性.假设您使用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();
}
Run Code Online (Sandbox Code Playgroud)最后,如果要测试身份验证,可以使用包含测试数据的数据库运行测试.
a)这不是单元测试,而是集成测试.单元测试没问题.
b)我会尝试将您的测试设置分开.为什么不在您未测试安全相关功能的测试中使用deactive spring security?
c)如果所有其他方法都失败了:JdbcTemplate
在测试设置期间注入一个对象并在SQL中手动创建用户数据.请参阅支持类以进行集成测试
归档时间: |
|
查看次数: |
11130 次 |
最近记录: |