在Spring 3.2.5→4.0.0版本更新后尝试编译源时,我有一些奇怪的行为。
来自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
来源,可以看出差异:
Spring 4.0.0:
public static <B extends DefaultMockMvcBuilder<B>> DefaultMockMvcBuilder<B> webAppContextSetup(WebApplicationContext context) {
return new DefaultMockMvcBuilder<B>(context);
}
Spring 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 :(得分:8)
我认为webAppContextSetup
方法的调用现在应该使用<B extends DefaultMockMvcBuilder<B>>
类显式参数化。显而易见的候选人是StandaloneMockMvcBuilder
或只是DefaultMockMvcBuilder
(尽管后者会生成关于未经检查或不安全操作的警告)。所以试试这个:
mockMvc = MockMvcBuilders.<StandaloneMockMvcBuilder>webAppContextSetup(wac).build();
答案 1 :(得分:3)
我必须将webAppContextSetup绑定到DefaultMockMvcBuilder,以便在我的构建(Java 1.6.0_65)中对此问题进行排序,并抑制由此产生的警告。
@SuppressWarnings({"unchecked", "rawtypes"})
@Before
public void setUp()
{
mockMvc = MockMvcBuilders.<DefaultMockMvcBuilder> webAppContextSetup(webApplicationContext).addFilter(springSecurityFilterChain).build();
}
如另一个答案中所述,如果您正在测试独立控制器而不是集成测试整个应用程序上下文,StandaloneMockMvcBuilder将在没有警告的情况下工作。
(如果可以,我会简单评论。)
答案 2 :(得分:3)
已针对Spring Framework 4.0.1修复此问题。
有关详细信息,请参阅以下JIRA问题:https://jira.springsource.org/browse/SPR-11238