@Autowire MockMvc - Spring Data Rest

时间:2018-02-02 19:48:00

标签: spring-boot spring-data-rest spring-test-mvc

鉴于存储库

public interface ResourceRepository extends CrudRepository<Resource, Long> { ... }

以下测试代码:

@WebMvcTest
@RunWith(SpringRunner.class)
public class RestResourceTests {

  @Autowired
  private MockMvc mockMvc;

  @Test
  public void create_ValidResource_Should201() {
    String requestJson = "...";

    mockMvc.perform(
      post("/resource")
        .content(requestJson)
        .contentType(MediaType.APPLICATION_JSON))
      .andExpect(status().isCreated()); // This fails with 404
  }

}

为了解决这个问题,我需要注入WebApplicationContext并手动创建MockMvc对象,如下所示:

@SpringBootTest
@RunWith(SpringRunner.class)
public class RestResourceTests {

  private MockMvc mockMvc;

  @Autowired
  private WebApplicationContext webApplicationContext;

  @Before
  public void setup() {
    this.mockMvc = webAppContextSetup(webApplicationContext).build();
  }

有没有更简单的方法来实现这个目标?

谢谢!

1 个答案:

答案 0 :(得分:4)

我想出了一个“干净”的解决方案,但这对我来说感觉就像一个错误。

@SpringBootTest
@RunWith(SpringRunner.class)
@AutoConfigureMockMvc // <-- this is the fix 
public class RestResourceTests {

  @Autowired
  private MockMvc mockMvc; // <-- now injects with repositories wired.

我认为这是一个错误的原因,@WebMvcTest注释已经将@AutoConfigureMockMvc注释放在被测试的类上。

感觉@WebMvcTest没有查看加载了@RestRepository的网络组件。