@Autowire MockMvc - Spring 数据休息

@Autowire MockMvc - Spring Data Rest

给定存储库

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();
  }

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

谢谢!

我想出了一个 "clean" 解决方案,但对我来说这就像一个错误。

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

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

我觉得这是一个错误的原因,@WebMvcTest 注释已经将 @AutoConfigureMockMvc 注释放在 class 正在测试中。

感觉@WebMvcTest没有在看加载了@RestRepository的web组件。