2017-07-17 45 views
0

私はsptingブート@WebMvcTestを持つコントローラ用のユニットを書いています。下記のように春のブートテストでHandlerMethodArgumentResolverを設定する方法

@WebMvcTest使用し、私はMockMvcオブジェクトを注入することができるであろう: - コントローラで

@RunWith(SpringRunner.class) 
@ContextConfiguration(classes = {TestConfig.class}) 
@WebMvcTest 
class MyControllerTest { 
    @Autowired 
    private MockMvc mockMvc; 

    @Test 
    public void my_controller_test() throws Exception { 
     mockMvc.perform(post("/create-user")) 
       .andExpect(status().isCreated()); 
    } 
} 

を私はスプリングHandlerMethodArgumentResolverを用いPrincipal引数を注入しています。 MockMvcで単体テストを書く方法を教えてください。私はPrincipalオブジェクトをコントローラメソッドの引数として注入できます。

は、@WebMvcTestと注釈されたテストではHandlerMethodArgumentResolverの豆をスキャンすると説明しています。だから私はHandlerMethodArgumentResolverを拡張したモックPrincipalオブジェクトを以下のように作成しました。

@Component 
public class MockPrincipalArgumentResolver implements HandlerMethodArgumentResolver { 
    @Override 
    public boolean supportsParameter(MethodParameter parameter) { 
    return parameter.getParameterType().equals(Principal.class); 
    } 

    @Override 
    public Object resolveArgument(MethodParameter parameter...) throws Exception { 
    return new MockPrincipal(); 
    } 
} 

しかし、引き続き引数MockPrincipalがコントローラメソッドに渡されていません。

春のブートバージョン: - 1.4.5.RELEASE

+1

追加する 'HandlerMethodArgumentResolver'を作成しないで、作成しているリクエストにプリンシパルを指定する必要があります。 'post(/ your-url).principal(新しいMockPrincipal())'です。 –

+0

ありがとうございました。私は時間を無駄に他のオプションを探して無駄になりました:)。あなたが気にしないなら、それが文書化されているところで言及してください? – Manu

答えて

1

あなたのコントローラを呼び出すためにMockMvcを使用しています。これで、パラメータ、本文、URL、プリンシパルなどでリクエストを準備する必要があります。指定しなかったものは含まれません(認証されたプリンシパルなしで基本的に呼び出しを行っています)。

MockMvcのSpring MVCテストのサポートは、一般的にリファレンスガイドに記載されています。

モックの作成に使用されるコンポーネントを確認するには、MockHttpServletRequestBuilderをご確認ください。あなたのpostメソッドが返すものは、MockHttpServletRequestBuilders.post(おそらくあなたのコード内の静的なインポート)を呼び出す必要があります。 post()の後に[CTRL] + [SPACE](またはあなたの好きなコード補完ショートカットがあなたのiDEにあるもの)があれば、利用可能なものについていくつかの洞察が得られます。

@Test 
public void my_controller_test() throws Exception { 
    mockMvc.perform(post("/create-user").principal(new MockPrincipal()) 
      .andExpect(status().isCreated()); 
} 

トリックを行う必要があります。

関連する問題