Spring Boot MVC Test - MockMvc 始终为空

2022-09-02 00:23:47

我正在尝试编写我的第一个Spring MVC测试,但我就是无法让Spring Boot将MockMvc依赖项注入我的测试类。这是我的课程:

@WebMvcTest
public class WhyWontThisWorkTest {

  private static final String myUri = "uri";
  private static final String jsonFileName = "myRequestBody.json";

  @Autowired
  private MockMvc mockMvc;

  @Test
  public void iMustBeMissingSomething() throws Exception {
    byte[] jsonFile = Files.readAllBytes(Paths.get("src/test/resources/" + jsonFileName));
    mockMvc.perform(
        MockMvcRequestBuilders.post(myUri)
            .content(jsonFile)
            .contentType(MediaType.APPLICATION_JSON))
        .andExpect(MockMvcResultMatchers.status().is2xxSuccessful());
  }
}

我已经检查了IntelliJ的调试器,可以确认mockMvc本身是空的。因此,所有异常消息告诉我的是“java.lang.NullPointerException”。

我已经尝试过为测试类添加更多通用的Spring Boot注释,例如“@SpringBootTest”或“@RunWith(SpringRunner.class)”,以防它与初始化Spring有关但没有运气。


答案 1

奇怪,前提是您还尝试过使用 和 。您是否也尝试过注释?下面的示例工作正常。@RunWith(SpringRunner.class)@SpringBootTest@AutoConfigureMockMvc

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class HelloControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void getHello() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders.get("/").accept(MediaType.APPLICATION_JSON))
                .andExpect(status().isOk())
                .andExpect(content().string(equalTo("Hello World of Spring Boot")));
    }
}

完整的示例在这里

还值得考虑以下关于@WebMvcTest和@AutoConfigureMockMvc注释用法的评论,详见Spring的文档

默认情况下,使用@WebMvcTest注释的测试也将自动配置Spring Security和MockMvc(包括对HtmlUnit WebClient和Selenium WebDriver的支持)。为了更精细地控制MockMVC,可以使用@AutoConfigureMockMvc注释。

通常,@WebMvcTest与@MockBean或@Import结合使用,以创建@Controller豆所需的任何协作者。

如果您希望加载完整的应用程序配置并使用 MockMVC,则应考虑将@SpringBootTest与@AutoConfigureMockMvc而不是此注释结合使用。

使用JUnit 4时,此注释应与@RunWith(SpringRunner.class)结合使用。


答案 2

我遇到了同样的问题。事实证明,由于注释不兼容因此没有注入@Test。导入是 ,但更改它以解决问题。MockMvcorg.junit.Testorg.junit.jupiter.api.Test


推荐