2016-07-03 18 views
8

新しいSpring Boot 1.4 @WebMvcTestを使ってMockMVcをさまざまな方法で設定する作業コードはほとんどありません。私はstandaloneSetupアプローチを理解しています。私が知りたいのは、MockMvcからWebApplicationContextまでの設定と、MockMvcの自動配線の違いです。Springブート1.4で@WebMvcTestでMockMvcをセットアップするMVCテスト

コードスニペット1:WebMvcTest APIドキュメント、デフォルトであたりとしてMockMvc WebApplicationContextセットアップを通じて

@RunWith(SpringRunner.class) 
@WebMvcTest(controllers = ProductController.class) 
public class ProductControllerTest { 

private MockMvc mockMvc; 

@Autowired 
private WebApplicationContext webApplicationContext; 

@MockBean 
private ProductService productServiceMock; 

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

@Test 
public void testShowProduct() throws Exception {  

    Product product1 = new Product(); 
    /*Code to initialize product1*/ 

    when(productServiceMock.getProductById(1)).thenReturn(product1); 

    MvcResult result = mockMvc.perform(get("/product/{id}/", 1)) 
      .andExpect(status().isOk()) 
      /*Other expectations*/ 
      .andReturn(); 
    } 
} 

、@WebMvcTestでアノテートテストも春のセキュリティとMockMvcを自動設定します。だから、ここでは401 Unauthorizedステータスコードが期待されましたが、テストには200ステータスコードが渡されます。

次に、私は自動配線MockMvcを試してみましたが、私は@AutoConfigureMockMvc(secure=false)を追加したり、セキュリティを無効にする@WebMvcTest注釈を更新しない限り、テストは、401不正なステータスコードで失敗します。続いて

@WebMvcTest(controllers = IndexController.class, secure = false) 


は渡すコードです明示的にセキュリティを無効にした後にのみ。

コードスニペット2:オートワイヤリングてMockMvc

@RunWith(SpringRunner.class) 
@WebMvcTest(controllers = ProductController.class) 
@AutoConfigureMockMvc(secure=false) 
public class ProductControllerTest { 
@Autowired 
private MockMvc mockMvc; 
@Autowired 
private WebApplicationContext webApplicationContext; 
@MockBean 
private ProductService productServiceMock; 

@Test 
public void testShowProduct() throws Exception {  

    Product product1 = new Product(); 
    /*Code to initialize product1*/ 

    when(productServiceMock.getProductById(1)).thenReturn(product1); 

    MvcResult result = mockMvc.perform(get("/product/{id}/", 1)) 
      .andExpect(status().isOk()) 
      /*Other expectations*/ 
      .andReturn(); 
    } 
} 

だから私の質問は以下のとおりです。自動配線MockMvcはなかったが、コードは1つのレポートAA 401不正なステータスコードのエラーをスニペットなかったのはなぜ

  1. 。また公式のdocが言うところを繰り返します。デフォルトでは、@WebMvcTestで注釈が付けられたテストは、Spring SecurityとMockMvcも自動的に設定します。しかし、この場合、@WebMvcTestは、(コードスニペット1は401エラーなしで通過するので)スプリングセキュリティの自動設定とは関係ありません。それは最終的に私がMockMvcをどのようにセットアップするかまで沸騰します。私はここで正しいですか?

  2. 両方のアプローチの違いと目的は何ですか?

  3. @AutoConfigureMockMvc(secure=false)でセキュリティを無効にする方法と、@WebMvcTest(controllers = IndexController.class, secure = false)との違いはどのように違いますか?どちらが優先されるのか、いつ使用されるのかはどこですか?

答えて

6

私も同様の問題に遭遇します。 @WebMvcTestは、基本認証でSpring Securityを自動的に設定しますが、私はWebSecurityConfigurerAdapterを継承するWebSecurityConfigクラスを持っています。このクラスでは基本認証を無効にし、トークンベースのセキュリティを設定しました。つまり、WebSecurityConfigクラスはSpring Securityの設定に使用されません。

問題を解決するために、@ContextConfigurationをユニットテストクラスに追加し、WebSecurityConfigクラスの依存関係のモックを追加しました。githubの中にこの問題によると

@RunWith(SpringRunner.class) 
@WebMvcTest(controllers = CategoryRestService.class) 
@ContextConfiguration(classes={MjApplication.class, WebSecurityConfig.class}) 
public class CategoryRestServiceTest { 

    @MockBean 
    private CategoryRepository repository; 

    @MockBean 
    CurrentUserDetailsService currentUserDetailsService; 

    @MockBean 
    TokenAuthProvider tokenAuthProvider; 

    @Autowired 
    MockMvc mockMvc; 

    private MediaType contentType = new MediaType(MediaType.APPLICATION_JSON.getType(), 
      MediaType.APPLICATION_JSON.getSubtype(), Charset.forName("utf8")); 


    @Test 
    public void getCategories() throws Exception { 
     Category category1 = new Category(); 
     category1.setName("Test Category 1"); 
     category1.setId(1L); 
     Category category2 = new Category(); 
     category2.setName("Test Category 2"); 
     category2.setId(2L); 
     List<Category> categoryList = new ArrayList<Category>(); 
     categoryList.add(category1); 
     categoryList.add(category2); 
     given(this.repository.findAll()) 
     .willReturn(categoryList); 
     mockMvc.perform(get("/public/rest/category")) 
     .andExpect(status().isOk()) 
     .andExpect(content().contentType(contentType)) 
     .andExpect(jsonPath("$[0].id", is(1))) 
     .andExpect(jsonPath("$[0].name", is("Test Category 1"))) 
     .andExpect(jsonPath("$[1].id", is(2))) 
     .andExpect(jsonPath("$[1].name", is("Test Category 2"))); 
    } 

} 
6

https://github.com/spring-projects/spring-boot/issues/5476

春・セキュリティ・テストは、あなたの質問に答えるクラスパス

にあるとき

@WebMvcTestオートは、デフォルトで基本認証を構成します:

  1. コードスニペット1では、 e MockMvcをテストクラスに追加する場合は、setupメソッドのビルダーに.apply(springSecurity())を追加する必要があります。スプリングは基本設定(カスタムセキュリティ設定はありません)を使用します。
  2. デフォルトでは

、テスト:第二はすでにMockMvcでベーシック認証が付属しているのと同じ事が、違いは=あなたが安全に使用するために持っている理由、それはあるドキュメントから

  • 偽であります@WebMvcTestで注釈を付けても、自動的に設定されます Spring SecurityとMockMvc(HtmlUnit WebClientのサポートを含みます) およびSelenium WebDriver)。 MockMVCの細かい制御のために、@AutoConfigureMockMvcアノテーションを使用することができます。

  • 2

    私は、これは直接関係するわからないんだけど、春ブーツと@WebMvcTestを使用している場合は、カスタム@EnableWebSecurity Configクラスは無視され、outstanding bugがあります。いくつかの回避策がバグレポートに記載されています。私は使用しています:

    @WebMvcTest(includeFilters = @Filter(classes = EnableWebSecurity.class)) 
    
    関連する問題