Java Spring4MVC单元测试未编译

Java Spring4MVC单元测试未编译,java,spring,compiler-errors,spring-test-mvc,spring-4,Java,Spring,Compiler Errors,Spring Test Mvc,Spring 4,我在Spring3.2.5之后试图编译源代码时有奇怪的行为→ 4.0.0版本更新 来自ApplicationControllerTest.java的错误代码段(相当于来自的代码): 错误: 编译错误: /C:/Development/../war/src/test/java/org/../web/controller/ApplicationControllerTest.java:[59,61]C:\Development\…\war\src\test\java\org\…\web\control

我在Spring3.2.5之后试图编译源代码时有奇怪的行为→ 4.0.0版本更新

来自
ApplicationControllerTest.java
的错误代码段(相当于来自的代码):

错误:

编译错误:
/C:/Development/../war/src/test/java/org/../web/controller/ApplicationControllerTest.java:[59,61]C:\Development\…\war\src\test\java\org\…\web\controller\ApplicationControllerTest.java:59:不兼容类型;推断的类型参数java.lang.Object不符合类型变量B的边界
找到:org.springframework.test.web.servlet.setup.DefaultMockMvcBuilder
必需:java.lang.Object

如果查看
MockMvcBuilders
源代码,您可以看到不同之处:

Spring 4.0.0:

public static <B extends DefaultMockMvcBuilder<B>> DefaultMockMvcBuilder<B> webAppContextSetup(WebApplicationContext context) {
    return new DefaultMockMvcBuilder<B>(context);
}
public静态默认MockMVCBuilder webAppContextSetup(WebApplicationContext上下文){
返回新的DefaultMockMvcBuilder(上下文);
}
弹簧3.2.5:

public static DefaultMockMvcBuilder<DefaultMockMvcBuilder<?>> webAppContextSetup(WebApplicationContext context) {
    return new DefaultMockMvcBuilder<DefaultMockMvcBuilder<?>>(context);
}
publicstaticdefaultmockmvcbuilder>(上下文);
}
我试图使它可编译,但没有成功


实际上,该框架应该与Java1.6.0_10兼容。我使用Java 1.6.0_45。

我认为
webAppContextSetup
方法的调用现在应该用
类显式参数化。明显的候选项是
StandaloneMockMvcBuilder
或干脆
DefaultMockMvcBuilder
(尽管后者将生成有关未检查或不安全操作的警告)。所以试试这个:

mockMvc = MockMvcBuilders.<StandaloneMockMvcBuilder>webAppContextSetup(wac).build();
mockMvc=MockMvcBuilders.webAppContextSetup(wac.build();

我必须将webAppContextSetup与DefaultMockMvcBuilder绑定,以便在我的构建(Java 1.6.065)中解决此问题,并抑制由此产生的警告

@SuppressWarnings({"unchecked", "rawtypes"})
@Before
public void setUp()
{
   mockMvc = MockMvcBuilders.<DefaultMockMvcBuilder> webAppContextSetup(webApplicationContext).addFilter(springSecurityFilterChain).build();
}
@SuppressWarnings({“unchecked”,“rawtypes”})
@以前
公共作废设置()
{
mockMvc=MockMvcBuilders.webAppContextSetup(webApplicationContext).addFilter(springSecurityFilterChain.build();
}
正如在另一个答案中所述,如果您正在测试独立控制器而不是集成测试完整的应用程序上下文,那么StandaloneMockMvcBuilder将在没有警告的情况下工作


(如果我可以的话,我会简单地评论。)

这已经为SpringFramework4.0.1解决了


有关详细信息,请参阅以下JIRA问题:

看起来他们为具有边界的类型参数切换了一个无界通配符类型。我想你可能已经发现了一个问题。是的,我看到了变化,它们似乎是有道理的。我不明白为什么编译器不能处理这种参数化,以及如何绕过JDK 1.6.0_45(或任何其他1.6.x版本)。这意味着文档不正确?也许JDK1.7编译起来没有问题…@dma_k在我看来,Spring文档中没有关于JDK兼容性的冲突,因为上面的代码在JDK1.6中编译并运行得非常完美,因为参数化修复很小。相反,Spring的新版本与旧版本不兼容。@是的,JDK1.7和Spring4中的原始代码没有问题,因为改进了类型推断(据我所知)
@SuppressWarnings({"unchecked", "rawtypes"})
@Before
public void setUp()
{
   mockMvc = MockMvcBuilders.<DefaultMockMvcBuilder> webAppContextSetup(webApplicationContext).addFilter(springSecurityFilterChain).build();
}