12

Spring 3.2.5 → 4.0.0 バージョンアップ後にソースをコンパイルしようとすると挙動がおかしくなる。

不完全なコード スニペット(ドキュメントApplicationControllerTest.javaのコードと同等):

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 のドキュメントによると、フレームワークは Java 1.6.0_10 と互換性があるはずです。Java 1.6.0_45 を使用しています。

4

3 に答える 3

8

webAppContextSetupメソッドの呼び出しは、 のクラスで明示的にパラメータ化する必要があると思います<B extends DefaultMockMvcBuilder<B>>。明白な候補はStandaloneMockMvcBuilder、 または 単純ですDefaultMockMvcBuilder(ただし、後者は、チェックされていない操作または安全でない操作に関する警告を生成します)。だからこれを試してください:

mockMvc = MockMvcBuilders.<StandaloneMockMvcBuilder>webAppContextSetup(wac).build();
于 2013-12-17T09:48:36.943 に答える
3

これは、Spring Framework 4.0.1 で修正されました。

詳細については、次の JIRA の問題を参照してください: https://jira.springsource.org/browse/SPR-11238

于 2014-01-04T17:39:04.587 に答える
3

私のビルド (Java 1.6.0_65) でこの問題を解決し、それによって発生した警告を抑制するために、webAppContextSetup を DefaultMockMvcBuilder に結び付ける必要がありました。

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

別の回答で述べたように、完全なアプリケーション コンテキストの統合テストではなく、スタンドアロン コントローラーをテストしている場合、 StandaloneMockMvcBuilder は警告なしで機能します。

(できればコメントするだけでした。)

于 2013-12-17T16:35:02.723 に答える