问题标签 [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.

0 投票
2 回答
11403 浏览

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(我在上面的代码示例中已经完成了),但是,一旦我这样做了,我立即得到了失败(它甚至没有达到重点没有它就会失败)。关于导致该异常的原因以及如何解决它的任何建议?

0 投票
1 回答
1358 浏览

java - 从元注释覆盖 ContextHierarchy 和 ContextConfiguration

我们有使用元注释的测试类:

但希望能够覆盖或附加到测试类本身的层次结构元素,例如:

到目前为止,这对我们没有用......是否有任何机制来实现这一点?我找到了https://jira.spring.io/browse/SPR-11038,但我认为这不是解决这种情况的方法。

谢谢!

0 投票
0 回答
1238 浏览

spring - 在 IntelliJ 中使用 Tiles 3 进行 Spring MVC 测试不起作用

我有以下非常简单的测试:

在 Eclipse 和 Maven 中运行没有任何问题,但在 IntelliJ 中没有。IntelliJ 无法加载 spring 应用程序上下文,因为 tilesConfigurer 找不到定义的视图定义。

这是堆栈跟踪:

任何想法如何解决这个问题?也许项目中的一些特殊配置?我相信资源加载器存在一些问题......

0 投票
2 回答
4592 浏览

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.

0 投票
2 回答
830 浏览

java - 使用弹簧测试框架模拟服务的预期结果

我想写一个测试用例来Restful web service使用Spring testing framework. 我模拟了该服务并能够成功运行测试用例。

但是,当服务被嘲笑时,它返回的是空响应。所以,我想设置服务的预期输出。

我可以使用不同的模拟框架来实现它,例如Mockitoor Jmockit(在下面的代码中,它与 Mockito 一起使用)。

without any addition/external testing frameworks但是,除了 internal 之外是否有可能Spring testing framework

0 投票
2 回答
4372 浏览

spring - 使用自定义 UserDetails 实现测试 Spring Security 和 MvcMock

我正在尝试按照这篇文章 [1] 在我的 Spring MvcMock 测试中模拟安全性。

我要测试的 REST 服务如下所示:

where@ActiveUser是自定义实现/扩展,@AuthenticationPrincipal并且AppUser是自定义UserDetails实现。

在测试中我这样做:

我还添加了一些TestExecutionLIsteners

```

但它失败了:

没关系,因为AppUser没有默认构造函数,但框架实际上不应该创建用户,而是使用我传递给测试的那个。

为了在运行时解决这个问题,我必须将其添加AuthenticationPrincipalArgumentResolverHandlerMethodArgumentResolverweb 配置中,但是我该如何在测试用例中做到这一点?

有什么可行的例子吗?

[1] https://spring.io/blog/2014/05/23/preview-spring-security-test-web-security

编辑:

测试类及其配置如下所示:

```

这是完整的堆栈跟踪:

```

```

0 投票
2 回答
2473 浏览

spring - 如何在春季测试中发送json而不是params

我使用 org.springframework.test.web.servlet.MockMvc 调用 Spring 控制器。

它看起来像这样:

一切看起来都很好。我也可以传递参数。但现在我需要发送 JSON(字符串)而不是参数。我怎样才能做到这一点?

0 投票
1 回答
1993 浏览

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 等而浪费时间?

0 投票
2 回答
15085 浏览

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)。

我有两个问题:

  1. 为什么注入的 WebApplicationContext 不会自动使用 SpringSecurity 过滤器?即使我可以获得 FilterChainProxy 并手动添加它,JavaDoc for EmbeddedWebApplicationContext 状态

上下文中定义的任何 {@link Servlet} 或 {@link Filter} bean 将自动注册到嵌入式 Servlet 容器

结果,我不希望必须手动添加安全过滤器链,因为我(错误地?)由于 Spring Boot 中的自动配置魔法而希望它“正常工作”?

  1. 为什么应用上下文中没有 FilterChainProxy?同样,也许我对 AutoConfiguration 的期望是不正确的——但我认为这将被配置为上下文配置的一部分。

提前感谢您的任何建议。


编辑

  • FilterChainProxy 没有被注入的原因是因为我的配置设置为

    公共无效配置(WebSecurity web){ web.debug(true);}

这实际上配置了一个org.springframework.security.web.debug.DebugFilter。无论此调试设置如何,我现在设法获取过滤器的方式如下:

如果我将其添加到 MockMvcBuilder 中,如下所示:

然后它会按预期工作。

但是,我不明白为什么 MockMVC 会忽略过滤器,因为这对于测试请求似乎很重要,因为过滤器中可能发生任何可能影响测试结果的事情。此外,这意味着要正确测试,我需要在 servlet 上下文中查找所有过滤器并建立它们的优先级/url 映射并适当地添加它们。这似乎容易出错且不必要。

0 投票
3 回答
20360 浏览

unit-testing - @ModelAttribute 控制器 spring-mvc 模拟

我想测试一个@ModelAttribute用于其方法参数之一的控制器。

@ModelAttribute方法getExampleEntity使用@RequestParam

我的控制器WebDataBinder用于调用工厂,该工厂根据参数“id”返回一个对象。

我的测试:

我想以某种方式进行模拟getExampleEntity(),以便每次使用参数“id”执行 POST 时,我都会收到一个用于测试的模拟对象(“exampleEntity”)。

我可以引入@Binding测试,但我必须模拟许多级别的方法(如 initBinder -> idEditoryFactory-> editor -> hibernateTemplate 等),才能从某个源(例如,数据库)获取实体。