问题标签 [spring-test-mvc]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
spring-mvc - 如何对使用 thymeleaf 的安全控制器进行单元测试(不获取 TemplateProcessingException)?
我正在尝试使用 spring security 和一个使用 thymeleaf 进行模板处理的简单家庭(根)控制器在 spring-boot 中运行单元测试。我正在尝试编写一些单元测试来验证我的安全权限是否正常工作,并且正确的数据是否从我的模板中隐藏或显示(它使用 thymeleaf spring 安全集成)。当我运行它时,应用程序本身可以正常工作。我只是想验证它是否正在使用一组集成测试。您可以在此处找到所有代码,但我还将在下面包含相关代码段:
控制器非常简单,除了渲染模板(在根 - 即“/”)之外什么也不做。
模板中有很多内容,但测试的相关位是:
最后是测试:
我在上述两个测试中得到的错误是:
testLoadRoot(ltistarter.controllers.AppControllersTest) 已用时间:0.648 秒 <<< 错误!org.springframework.web.util.NestedServletException:请求处理失败;嵌套异常是 org.thymeleaf.exceptions.TemplateProcessingException:在 org.springframework.web.context.support.WebApplicationContextUtils.getRequiredWebApplicationContext 处执行处理器“org.thymeleaf.extras.springsecurity3.dialect.processor.AuthorizeAttrProcessor”(home:33)时出错(WebApplicationContextUtils.java:84) 在 org.thymeleaf.extras.springsecurity3.auth.AuthUtils.getExpressionHandler(AuthUtils.java:260) 在 org.thymeleaf.extras.springsecurity3.auth.AuthUtils.authorizeUsingAccessExpression(AuthUtils.java:182) 在org.thymeleaf.extras.springsecurity3.dialect.processor.AuthorizeAttrProcessor。
但是,只有在启用两个测试并且包含 springSecurityFilter 时才会发生这种情况。如果我禁用其中一项测试并删除 springSecurityFilter 代码(.addFilter(springSecurityFilter, "/*")
),那么我将不再收到该错误。我怀疑某些东西可能会弄乱 WebApplicationContext 或使安全性内容处于某种故障状态,但我不确定我需要重置或更改什么。
因此,如果我取出第二个测试并删除 springSecurityFilter 那么我的第一个测试仍然会失败(特别是这个assertTrue(content.contains("Form Login endpoint"))
),但我不再收到任何错误。当我查看生成的 HTML 时,我没有看到任何使用该sec:authorize
属性的标签内容。
所以我四处搜索,发现一个我需要添加的建议springSecurityFilter
(我在上面的代码示例中已经完成了),但是,一旦我这样做了,我立即得到了失败(它甚至没有达到重点没有它就会失败)。关于导致该异常的原因以及如何解决它的任何建议?
java - 从元注释覆盖 ContextHierarchy 和 ContextConfiguration
我们有使用元注释的测试类:
但希望能够覆盖或附加到测试类本身的层次结构元素,例如:
到目前为止,这对我们没有用......是否有任何机制来实现这一点?我找到了https://jira.spring.io/browse/SPR-11038,但我认为这不是解决这种情况的方法。
谢谢!
spring - 在 IntelliJ 中使用 Tiles 3 进行 Spring MVC 测试不起作用
我有以下非常简单的测试:
在 Eclipse 和 Maven 中运行没有任何问题,但在 IntelliJ 中没有。IntelliJ 无法加载 spring 应用程序上下文,因为 tilesConfigurer 找不到定义的视图定义。
这是堆栈跟踪:
任何想法如何解决这个问题?也许项目中的一些特殊配置?我相信资源加载器存在一些问题......
spring-test - MockMvc WebAppConfiguration:在 web.xml 中加载 servlet 映射
我正在使用 MockMvc 编写集成测试,我想知道是否有办法从 web.xml 加载 servlet 映射(这通常无关紧要)。
我有一个HandlerInteceptor
将请求 URI(来自HttpServletRequest
)与模板(使用AntPathMatcher
)相匹配的自定义。
在 web.xml 中,我定义了这样的 servlet 映射(带有相应的 mobile-context.xml):
所以当一个控制器定义一个像这样的映射时"/operation"
,请求真的应该被发送到"/services/operation"
。我的自定义HandlerInterceptor
将 URI 请求与"/**/services/{operationName}/**"
.
我的应用程序在 Tomcat 上运行良好。但是,在@ContextConfiguration 中,我只能指定mobile-context.xml,因为web.xml 不是spring 配置文件。因此,MockMvc 只允许我向"/operation"
而不是发出请求"/services/operation"
,从而导致我HandlerInterceptor
抛出异常。
有没有办法让 MockMvc 注册 servlet 映射,或者有什么聪明的方法解决这个问题?提前致谢。
编辑:这里有一个类似的问题表明我需要的东西是不可能的,但我没有更改源代码的权限,所以我不能修改模板或HandlerInterceptor
.
java - 使用弹簧测试框架模拟服务的预期结果
我想写一个测试用例来Restful web service
使用Spring testing framework
. 我模拟了该服务并能够成功运行测试用例。
但是,当服务被嘲笑时,它返回的是空响应。所以,我想设置服务的预期输出。
我可以使用不同的模拟框架来实现它,例如Mockito
or Jmockit
(在下面的代码中,它与 Mockito 一起使用)。
without any addition/external testing frameworks
但是,除了 internal 之外是否有可能Spring testing framework
。
spring - 使用自定义 UserDetails 实现测试 Spring Security 和 MvcMock
我正在尝试按照这篇文章 [1] 在我的 Spring MvcMock 测试中模拟安全性。
我要测试的 REST 服务如下所示:
where@ActiveUser
是自定义实现/扩展,@AuthenticationPrincipal
并且AppUser
是自定义UserDetails
实现。
在测试中我这样做:
我还添加了一些TestExecutionLIsteners
:
```
但它失败了:
没关系,因为AppUser
没有默认构造函数,但框架实际上不应该创建用户,而是使用我传递给测试的那个。
为了在运行时解决这个问题,我必须将其添加AuthenticationPrincipalArgumentResolver
到HandlerMethodArgumentResolver
web 配置中,但是我该如何在测试用例中做到这一点?
有什么可行的例子吗?
[1] https://spring.io/blog/2014/05/23/preview-spring-security-test-web-security
编辑:
测试类及其配置如下所示:
```
这是完整的堆栈跟踪:
```
```
spring - 如何在春季测试中发送json而不是params
我使用 org.springframework.test.web.servlet.MockMvc 调用 Spring 控制器。
它看起来像这样:
一切看起来都很好。我也可以传递参数。但现在我需要发送 JSON(字符串)而不是参数。我怎样才能做到这一点?
spring - Spring Boot Java Config - 拆分 Web(控制器等)和服务
在我的旧 XML 配置项目中,我可以在我的配置中执行以下操作
mvc-context.xml
service-context.xml
在我的测试中,我可以执行以下操作
然后我可以针对我的 MVC 配置运行测试,而无需加载我的服务和 JPA 存储库,而是将我的模拟@Autowired
放入我的控制器中。
但是,Spring Boot 应用程序在主上下文配置中具有以下内容
这@ComponentScan
显然找到了 all @Controller
,@Service
等
如果我现在尝试测试我的 MVC 上下文,我会加载不需要的服务和存储库。
我试图做的是创建 2 个新配置
Mvc.java
Services.java
但是这不起作用,当我尝试启动我的应用程序时,我会收到@Autowire
错误No qualifying bean of type
我会以错误的方式解决这个问题吗?
如何做到这一点,以便我可以在我的 MVC 上下文上运行测试,而不会因加载 JPA EntityManagers、Spring Data Repositories 等而浪费时间?
spring-security - 使用 MockMVC 集成测试 Spring Boot
我在使用 MockMvc 测试 Spring Boot 应用程序时遇到了一些问题。
我有以下测试类:
这导致 HTTP 200 而不是 401。我启用了组件扫描和自动配置,并且在我的 SecuityConfiguration 类中配置了 spring 安全性,如下所示:
如果我使用 RestTemplate 进行访问,http://localhost:8080/accounts/1
那么我会得到预期的行为(HTTP 401)。
我已经看到其他示例(例如Spring Boot setup security for testing)建议我使用该方法自动装配FilterChainProxy
并手动添加过滤器。WebApplicationContext.addFilters(filterChainProxy)
然而,这对我来说实际上是失败的(org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.security.web.FilterChainProxy] found
)。
我有两个问题:
- 为什么注入的 WebApplicationContext 不会自动使用 SpringSecurity 过滤器?即使我可以获得 FilterChainProxy 并手动添加它,JavaDoc for EmbeddedWebApplicationContext 状态
上下文中定义的任何 {@link Servlet} 或 {@link Filter} bean 将自动注册到嵌入式 Servlet 容器
结果,我不希望必须手动添加安全过滤器链,因为我(错误地?)由于 Spring Boot 中的自动配置魔法而希望它“正常工作”?
- 为什么应用上下文中没有 FilterChainProxy?同样,也许我对 AutoConfiguration 的期望是不正确的——但我认为这将被配置为上下文配置的一部分。
提前感谢您的任何建议。
编辑
FilterChainProxy 没有被注入的原因是因为我的配置设置为
公共无效配置(WebSecurity web){ web.debug(true);}
这实际上配置了一个org.springframework.security.web.debug.DebugFilter
。无论此调试设置如何,我现在设法获取过滤器的方式如下:
如果我将其添加到 MockMvcBuilder 中,如下所示:
然后它会按预期工作。
但是,我不明白为什么 MockMVC 会忽略过滤器,因为这对于测试请求似乎很重要,因为过滤器中可能发生任何可能影响测试结果的事情。此外,这意味着要正确测试,我需要在 servlet 上下文中查找所有过滤器并建立它们的优先级/url 映射并适当地添加它们。这似乎容易出错且不必要。
unit-testing - @ModelAttribute 控制器 spring-mvc 模拟
我想测试一个@ModelAttribute
用于其方法参数之一的控制器。
@ModelAttribute
方法getExampleEntity
使用@RequestParam
:
我的控制器WebDataBinder
用于调用工厂,该工厂根据参数“id”返回一个对象。
我的测试:
我想以某种方式进行模拟getExampleEntity()
,以便每次使用参数“id”执行 POST 时,我都会收到一个用于测试的模拟对象(“exampleEntity”)。
我可以引入@Binding
测试,但我必须模拟许多级别的方法(如 initBinder -> idEditoryFactory-> editor -> hibernateTemplate 等),才能从某个源(例如,数据库)获取实体。