如何使用 Spring Security 对 Spring 4 DAO 方法进行单元测试?
Posted
技术标签:
【中文标题】如何使用 Spring Security 对 Spring 4 DAO 方法进行单元测试?【英文标题】:How do I unit test a Spring 4 DAO method with Spring Security? 【发布时间】:2016-06-05 22:22:20 【问题描述】:我对 Spring 4 MVC 应用程序的 DAO 层进行了一些单元测试。然后我将 Spring Security 添加到我的控制器中的某些方法以及它们使用的 DAO 中。
我想出了如何使 @WithMockUser 注释在控制器测试中起作用,但我对 DAO 测试感到困惑。我在每个 dao 测试中遇到的例外是:
java.lang.IllegalStateException: Failed to load ApplicationContext
....
Caused by: java.lang.IllegalArgumentException: An AuthenticationManager is required
我在 DaoTest 开始时有这些注释:
@TestExecutionListeners( WithSecurityContextTestExecutionListener.class )
@ContextConfiguration(classes = DaoConfig.class)
@ContextConfiguration
与实际代码相同;我有建议让它与众不同,但没有什么具体的。我该如何解开这个?我也希望有一种方法可以在不使用 org.springframework.web.* 或 org.springframework.test.web.* 类的情况下做到这一点,因为这应该在整个网络层的“下方”。
【问题讨论】:
【参考方案1】:一般来说,一次测试太多东西并不是一个好主意。通过单元测试,您只想测试一件事和一件事。我的建议是当你的 DAO 单元测试运行时根本不加载 Spring Security。您应该能够使您的 DAO 单元测试类扩展某种 AbstractTest 类,该类加载一个单独的 applicationContext-test.xml 或根本不包含 Spring Security 的 Java Config。这应该允许您的单元测试不必穿透单元测试真正不应该关心的某些安全层。除非,也就是说,您实际上是在尝试集成测试。那将完全是另一种情况......希望这会有所帮助。
【讨论】:
目前,我们的团队同意将 Spring Security 移出 DAO 层并将其移回控制器和服务层。我认为这是一种更好的架构,可以让 DAO 不必担心允许哪个用户调用哪个方法,顺便简化了测试。以上是关于如何使用 Spring Security 对 Spring 4 DAO 方法进行单元测试?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Spring Security Saml 和 SP 应用程序的无状态会话
Spring Security:登录后如何重定向到 REST url
Spring security Saml - SP 和 IDP 的时间差
在期待多个应用程序时,我应该使用 Spring Security SAML 还是 Shiboleth SP?
生成 SP 元数据时出现意外的堆栈跟踪表单 Spring-Security-SAML?
如何使用 Spring MVC & Security、Jasig CAS 和 JSP 视图在 Spring Boot 2 中配置 UTF-8?