问题标签 [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 投票
3 回答
19279 浏览

java - 使用 Powermock 测试 Spring 控制器

我有一个测试特定控制器的类,它工作正常

我在那里使用来自mockito.org的 Google 的 Mockito 库来模拟我的底层 bean。

现在我的问题如下:我有一些类也需要模拟,但它们有final方法,谷歌的模拟似乎没有解决这个问题。我的一位同事建议使用 powermock.org 的Powermock。但它需要用注释来注释测试器类@RunWith(PowerMockRunner.class)。如果我使用它,我必须删除注释@RunWith(SpringJUnit4ClassRunner.class),这会给我带来问题,因为不会创建 Spring 测试上下文。我怎样才能避免这种情况?

建议后我已配置为使用PowerMockRule而不是@RunWith注释

我的项目maven依赖如下

现在我的课看起来像这样(另一个控制器测试)

但是在运行我的测试之后,我得到了以下异常跟踪

com.thoughtworks.xstream.converters.ConversionException:javassist.NotFoundException:com.somecompany.analytics.manager.db.api.MlDao$$EnhancerByMockitoWithCGLIB$$b86d7415:javassist.NotFoundException:com.somecompany.analytics.manager.db.api。 MlDao$$EnhancerByMockitoWithCGLIB$$b86d7415 ---- 调试信息 ---- 消息:javassist.NotFoundException: com.somecompany.analytics.manager.db.api.MlDao$$EnhancerByMockitoWithCGLIB$$b86d7415 原因异常:java.lang。 RuntimeException 原因消息:javassist.NotFoundException:com.somecompany.analytics.manager.db.api.MlDao$$EnhancerByMockitoWithCGLIB$$b86d7415 类:com.somecompany.ui.controllers.ThirdPartyLoginController 所需类型:com.somecompany.ui.controllers .ThirdPartyLoginController 转换器类型:com.thoughtworks。xstream.converters.reflection.ReflectionConverter 路径:/org.powermock.modules.junit4.rule.PowerMockStatement$1/outer-class/fNext/fTarget/thirtPartyLoginController/mlDao 行号:14 类1 :com.somecompany.ui.controllers.ThirdPartyLoginControllerTest 类2 :org.junit.internal.runners.statements.InvokeMethod 类[3]
:org.powermock.modules.junit4.rule.PowerMockStatement 类[4]
:org.powermock。 modules.junit4.rule.PowerMockStatement$1 版本
: null ------------------- 在 com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java: 79) 在 com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:65) 在 com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:66) 在 com.thoughtworks.xstream.converters.reflection .AbstractReflectionConverter.unmarshallField(AbstractReflectionConverter.java:355) 在 com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:306) 在 com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarstract.java(Abs :234) 在 com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:72) 在 com。thinkworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:65) 在 com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:66) 在 com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshallField( AbstractReflectionConverter.java:355) 在 com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:306) 在 com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:234) 在 com .thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:72) 在 com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:65) 在 com.thoughtworks.xstream.core。TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:66) at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshallField(AbstractReflectionConverter.java:355) at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java: 306) 在 com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:234) 在 com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:72) 在 com.thoughtworks.xstream.core .AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:65) 在 com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:66) 在 com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter。unmarshallField(AbstractReflectionConverter.java:355) at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:306) at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:23)在 com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:72) 在 com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:65) 在 com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother (TreeUnmarshaller.java:66) 在 com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:50) 在 com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:134) 在 com.thoughtworks。 xstream.core。AbstractTreeMarshallingStrategy.unmarshal(AbstractTreeMarshallingStrategy.java:32) at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1052) at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1036) at com.thoughtworks.xstream .XStream.fromXML(XStream.java:912) 在 com.thoughtworks.xstream.XStream.fromXML(XStream.java:903) 在 org.powermock.classloading.DeepCloner.clone(DeepCloner.java:54) 在 org.powermock。 classloading.ClassloaderExecutor.execute(ClassloaderExecutor.java:89) at org.powermock.classloading.ClassloaderExecutor.execute(ClassloaderExecutor.java:78) at org.powermock.modules.junit4.rule.PowerMockStatement.evaluate(PowerMockRule.java:49)在 org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74) 在 org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:82) 在 org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72) 在 org.springframework.test。 context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:240) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) at org.junit.runners.ParentRunner.access$000(ParentRunner.java: 53) 在 org.springframework.test.context.junit4.statements 的 org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)。RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) at org.junit.runners.ParentRunner.run(ParentRunner.java:309)在 org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:180) 在 org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 在 org.eclipse.jdt .internal.junit.runner.TestExecution.run(TestExecution.java:38) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 在 org.eclipse.jdt.internal.junit .runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 引起:java.lang.RuntimeException:javassist.NotFoundException:com.somecompany.idm.analytics.manager.db。 api.MlDao$$EnhancerByMockitoWithCGLIB$$b86d7415 at org.powermock.core.classloader.MockClassLoader.loadUnmockedClass(MockClassLoader.java:199) at org.powermock.core.classloader.MockClassLoader.loadModifiedClass(MockClassLoader.java:149) at org. powermock.core.classloader.DeferSupportingClassLoader.loadClass(DeferSupportingClassLoader.java:67) at java.lang.ClassLoader.loadClass(ClassLoader.java:356) at com.thoughtworks.xstream.core.util.ClassLoaderReference.loadClass(ClassLoaderReference.java: 31) 在 com.thoughtworks.xstream.mapper.DefaultMapper.realClass(DefaultMapper.java:49) 在 com.thoughtworks。xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 在 com.thoughtworks.xstream.mapper.DynamicProxyMapper.realClass(DynamicProxyMapper.java:55) 在 com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java: 30) 在 com.thoughtworks.xstream.mapper.PackageAliasingMapper.realClass(PackageAliasingMapper.java:88) 在 com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 在 com.thoughtworks.xstream.mapper.ClassAliasingMapper .realClass(ClassAliasingMapper.java:79) 在 com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 在 com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 在 com。 com.thoughtworks.xstream.mapper.MapperWrapper 上的 thinkworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)。realClass(MapperWrapper.java:30) 在 com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 在 com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 在 com.thoughtworks .xstream.mapper.ArrayMapper.realClass(ArrayMapper.java:74) 在 com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 在 com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java :30) 在 com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 在 com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 在 com.thoughtworks.xstream.mapper。 MapperWrapper.realClass(MapperWrapper.java:30) 在 com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 在 com.thoughtworks.xstream。mapper.MapperWrapper.realClass(MapperWrapper.java:30) 在 com.thoughtworks.xstream.mapper.CachingMapper.realClass(CachingMapper.java:45) 在 com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.determineType(AbstractReflectionConverter.java:第 458 章.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:72) ... 57 更多原因:javassist.NotFoundException: com.somecompany.analytics.manager.db.api.MlDao$$EnhancerByMockitoWithCGLIB$$b86d7415 at javassist.ClassPool.get (ClassPool.java:450) 在 org.powermock.core。classloader.MockClassLoader.loadUnmockedClass(MockClassLoader.java:192) ... 87 更多

0 投票
1 回答
4039 浏览

spring - Spring mvc 测试 - 使用 Autowired 注释测试控制器

我正在尝试使用 spring 测试框架为我的控制器创建一些测试。

在这篇文章之后:http: //blog.springsource.org/2012/11/12/spring-framework-3-2-rc1-spring-mvc-test-framework/我创建了这个测试类

我的 testContext.xml 是

现在,当我运行测试时,我会收到很多消息,例如:

所以通过 mockito 推断类型存在一些问题,但是当我进入调试模式并检查我的控制器时,我仍然可以看到对象被正确注入。(我@Autowire在我的控制器中使用注释)。

无论如何,当我尝试运行此测试时,由于以下原因导致测试失败

什么可能是我的问题的根源?我认为我遵循了本教程的每一步。

0 投票
1 回答
2700 浏览

spring - 神秘问题:RequestMappingHandlerAdapter:构造函数抛出异常;嵌套异常是 java.lang.NullPointerException

我在 spring-mvc-test 和以下测试类中遇到了一个神秘的问题:

这是mvc-dispatcher-servlet.xml

这是最后的堆栈跟踪

请注意,该应用程序在浏览器中运行良好。只有在运行上述测试类时才会出现该问题。

0 投票
1 回答
99 浏览

spring - 如何更改此 Spring Test Framework Test 以使用 JSON 返回?

我正在尝试更改以下 Spring Test Framework 以测试以下 json 返回:

这是我的测试代码,我只是不知道如何更改它以检查 JSON 和 JSON 中的值。如果有人能告诉我要改变什么,那就太好了..谢谢

0 投票
0 回答
226 浏览

java - 使用 @Autowired 字段测试 Spring Controller,为字段返回 null 但获取控制器

嗨,我有一个控制器,我正在尝试测试,没有模拟。

测试类:

通过测试进行调试时,我得到了控制器的值,但自动装配的 service1 和 2 的值为空。

xml 文件确实包含所有服务和控制器的基础包<context: component-scan>

如果删除它会给我创建 bean 的错误。即使我删除了其中一个服务基础包。

有什么测试需要添加到我的配置中吗?

类型1:

自动装配的 Type1 实现类是:

0 投票
1 回答
2355 浏览

template-engine - 使用 Spring 3.2 测试框架从测试执行环境中使用 Thymeleaf 解析模板时出错

只是尝试使用 Spring 3.2 测试框架的新特性,以便在 Web 层进行真正的集成测试。在 Spring 3.2 中使用“SpringJUnit4ClassRunner”触发测试时遇到问题,因为模板引擎抱怨无法解析模板名称:

当然,引擎正在搜索/WEB-INF/views/mobile/index.html周围的资源,在正常执行模式下是正确的,但在类路径中沿着测试执行环境不存在:*classpath (src/test/resources) 在基于 Maven 的项目中 * /WEB-INF/views/mobile/index.html

有没有办法让引擎从“真实路径”中获取资源,以免在测试类路径中维护每个 html 视图的副本?

提前致谢,

0 投票
1 回答
1069 浏览

java - 弹簧MVC;测试重定向是否是相对的

我想测试我的控制器是否返回正确的重定向(相对/上下文相对/绝对)。如何使用 spring 的 mockMVC 对其进行测试?我可以避免使用不同上下文启动服务器 2 次的集成测试吗?

0 投票
1 回答
1840 浏览

rest - Junit测试restful服务

我编写了一个 junit 来离线测试我的休息服务。我的休息控制器的 junit 扩展了 AbstractControllerTestSupport,它用于创建 dispatcherservlet 实例。

以下是我的加载器类。

测试在 spring 版本 3.0 上运行良好。但是,如果我切换到 spring 3.2.x,它会给我以下错误“类型 MockWebContextLoader 必须实现继承的抽象方法 SmartContextLoader.loadContext(MergedContextConfiguration)”。这是因为在 3.2.2 中“AbstractContextLoader " 实现 "SmartContextLoader" 。

你能为我提供解决方法吗?

0 投票
3 回答
10662 浏览

json - 一起测试 Spring asyncResult() 和 jsonPath()

我正在使用一个安静的 url 来启动一个长时间运行的后端进程(它通常在一个 cron 计划中,但我们希望能够手动启动它)。

下面的代码有效,当我手动测试时,我会在浏览器中看到结果。

当我在没有Callable使用以下代码的情况下进行测试时,一切正常(我更改了预期的错误消息以简化帖子)。

当我添加Callable但是它不起作用。我也在下面尝试过,但没有奏效。还有人成功吗?

以下是我的 print() 中的相关部分。在这种情况下,mockMvc 似乎无法正确解开 Json(即使它在我的浏览器中工作)?当我在没有Callable看到完整 JSON 的情况下执行此操作时。

0 投票
1 回答
4366 浏览

java - 我可以配置 MockMvcBuilders.standaloneSetup() 以使用我的消息转换器 XML 配置吗?

我正在开发一个 Spring MVC 3.2 Web 应用程序,并尝试在我的单元测试中使用新的MockMvc测试实用程序。我想测试两个单独的控制器以及整个 Web 应用程序加载我的 Spring 配置 XML 文件。从Javadoc看来,我想对前者使用standaloneSetup ,对后者使用webAppContextSetup

但是,当我的控制器寻找消息转换器来转换输出时,我遇到了问题。我对standaloneSetup方法的Javadoc 的解释似乎不正确。这是此方法的 Javadoc:

通过注册一个或多个 @Controller 的实例并以编程方式配置 Spring MVC 基础结构来构建 MockMvc。这允许完全控制控制器的实例化和初始化,以及它们的依赖关系,类似于普通的单元测试,同时也可以一次测试一个控制器。

使用此选项时,会自动创建 DispatcherServlet 为带注释控制器的请求提供服务所需的最小基础结构,并且可以对其进行自定义,从而产生与 MVC Java 配置提供的配置相同的配置,但使用构建器样式方法除外。

如果应用程序的 Spring MVC 配置相对简单,例如在使用 MVC 命名空间或 MVC Java 配置时,那么使用此构建器可能是测试大多数控制器的好选择。可以使用更少的测试来专注于测试和验证实际的 Spring MVC 配置。

我将“最小基础架构”和“及其依赖项”解释为意味着除了它们的所有依赖项之外,还将加载我指定的控制器,尽管我包括消息转换器。然而,情况似乎并非如此。我需要一个自定义配置来满足 2 个要求:

  1. 一个使用“application/json”的 PUT 操作,该操作被转换为带有 Joda DateTime 字段的 POJO。因此,我在 Spring 配置中包含以下内容:

    这适用于webAppContextSetup但如果我想使用standaloneSetup,看起来我需要手动创建和配置一个MappingJackson2HttpMessageConverter ,该 MappingJackson2HttpMessageConverter配置了我的自定义ObjectMapper,它注册了JodaModule

    /li>
  2. 生成“application/custom+xml”的 GET 操作。当我加载webAppContextSetup时,无需额外配置即可使用。但是,当我加载StandaloneSetup时,之前发生的任何 Spring 配置都不会发生,并且我看到以下错误消息:

    有人可以描述这里发生的事情吗?当我调用webAppContextSetup时是否包含一些隐藏或默认的消息转换器,但是当我调用上面的代码时,我是否以某种方式覆盖了这些转换器?我怎样才能包括它们?

MockMvc 是否有更简单的方法来设置单个控制器和mvc:annotation-driven中的所有配置?我可以将 MockMvcBuilders.standaloneSetup() 配置为使用我的消息转换器 XML 配置,而不是手动配置每一个吗?