2013-12-13 96 views
12

在Spring 3.2.5→4.0.0版本更新之后尝试编译源代码时,出现奇怪的行为。Spring4 MVC单元测试不编译

故障代码段从ApplicationControllerTest.java(它等同于从documentation代码):

import org.springframework.test.context.web.WebAppConfiguration; 
import org.springframework.test.web.servlet.MockMvc; 
import org.springframework.test.web.servlet.setup.MockMvcBuilders; 
import org.springframework.web.context.WebApplicationContext; 
... 
@Autowired 
private WebApplicationContext wac; 

private MockMvc    mockMvc; 

@Before 
public void setUp() { 
    mockMvc = MockMvcBuilders.webAppContextSetup(wac).build(); 
} 

错误:

COMPILATION ERROR : /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: incompatible types; inferred type argument(s) java.lang.Object do not conform to bounds of type variable(s) B found : <B>org.springframework.test.web.servlet.setup.DefaultMockMvcBuilder<B> required: java.lang.Object

如果观察到MockMvcBuilders源,一个可以看到的区别:

弹簧4.0.0:

public static <B extends DefaultMockMvcBuilder<B>> DefaultMockMvcBuilder<B> webAppContextSetup(WebApplicationContext context) { 
    return new DefaultMockMvcBuilder<B>(context); 
} 

春3.2.5:

public static DefaultMockMvcBuilder<DefaultMockMvcBuilder<?>> webAppContextSetup(WebApplicationContext context) { 
    return new DefaultMockMvcBuilder<DefaultMockMvcBuilder<?>>(context); 
} 

我试图让它编译没有成功。

其实Spring documentation说框架应该是Java 1.6.0_10兼容。我使用Java 1.6.0_45。

+0

看起来他们交换了一个无界的通配符类型有界的类型参数。我想你可能已经发现了一个问题。 –

+0

是的,我看到了变化,他们似乎有道理。我不明白为什么编译器无法应付这种参数化,我该如何解决JDK 1.6.0_45(或任何其他1.6.x版本)的问题。 –

回答

8

我认为webAppContextSetup方法的调用现在应该用类<B extends DefaultMockMvcBuilder<B>>明确地参数化。明显的候选人是StandaloneMockMvcBuilder或简单DefaultMockMvcBuilder(虽然后者会产生一个关于未经检查或不安全操作的警告)。所以,试试这个:

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

这意味着文档不正确?也许在JDK 1.7中编译时没有问题... –

+0

@dma_k在我看来,Spring文档中没有关于jdk兼容性的冲突,因为上面的代码在JDK 1.6中编译和运行时给出了小参数化修复。相反,Spring的新版本与旧版本不兼容。 –

+0

@dma_k是的,因为改进了类型推断,所以在JDK 1.7和Spring 4中没有问题(因为我了解它) –

3

我只好配合才能出在我的体型(Java 1.6.0_65)排序这个问题webAppContextSetup到DefaultMockMvcBuilder,并抑制起因于该警告。

@SuppressWarnings({"unchecked", "rawtypes"}) 
@Before 
public void setUp() 
{ 
    mockMvc = MockMvcBuilders.<DefaultMockMvcBuilder> webAppContextSetup(webApplicationContext).addFilter(springSecurityFilterChain).build(); 
} 

作为另一个答案StandaloneMockMvcBuilder将工作没有警告,如果你正在测试一个独立的控制器,而不是集成测试完整的应用程序上下文说明。

(本来只是评论,如果我能有。)