Spring Boot MVC 测试 - MockMvc 始终为 null

新手上路,请多包涵

我正在尝试编写我的第一个 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”。

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

原文由 ElDuderino 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.1k
2 个回答

奇怪,前提是您还尝试过 @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 bean 所需的任何协作者。

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

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

原文由 alainlompo 发布,翻译遵循 CC BY-SA 4.0 许可协议

我遇到了同样的问题。事实证明 MockMvc 由于 不兼容 @Test 注释 而未被注入。导入是 org.junit.Test ,但将其更改为 org.junit.jupiter.api.Test 解决了问题。

原文由 Maksym Kosenko 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏