2013-12-13 4 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

1はMockMvcBuilders源に見える場合は、1が違いを見ることができます:

スプリング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上記のコードはJDK 1.6でコンパイルされ、小さなパラメータ化の問題があるため完全に実行されるので、Springのドキュメントではjdkとの互換性に関して矛盾はありません。むしろ新しいバージョンのSpringは古いものと互換性がありません。 –

+0

@dma_kそして、はい、私は理解しているように、型推論の改善のために、元のコードでJDK 1.7とSpring 4に問題はありません。 –

3

私は私のビルド(Javaの1.6.0_65)でこの問題を整理し、その結果からの警告を抑制するためにDefaultMockMvcBuilderにwebAppContextSetupを結ぶ必要がありました。あなたは、完全なアプリケーションコンテキストをテストし、統合するのではなく、スタンドアローンのコントローラをテストする場合StandaloneMockMvcBuilderは、警告なしに動作します別の答えで述べたように

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

(私が持っていることができれば、単純にコメントしているでしょう。)

関連する問題