Spring Boot MVC测试-MockMvc始终为null

时间:2019-12-30 16:54:45

标签: java spring-boot junit

我正在尝试编写我的第一个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的调试器进行了检查,可以确认嘲笑Mvc本身为空。因此,所有异常消息告诉我的是“ java.lang.NullPointerException”。

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

3 个答案:

答案 0 :(得分:3)

我遇到了同样的问题。结果证明,由于不兼容的 MockMvc 注释,没有注入 @Test。导入为 org.junit.Test,但将其更改为 org.junit.jupiter.api.Test 解决了问题。

答案 1 :(得分: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")));
    }
}

完整示例here

也许值得考虑以下有关@WebMvcTest和@AutoConfigureMockMvc注释用法的注释,如Spring's documentation

中所述
  

默认情况下,带有@WebMvcTest注释的测试还将自动配置Spring Security和MockMvc(包括对HtmlUnit WebClient和Selenium WebDriver的支持)。要对MockMVC进行更细粒度的控制,可以使用@AutoConfigureMockMvc批注。

     

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

     

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

     

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

答案 2 :(得分:0)

接受的答案有效,但是我也没有导入 @RunWith(SpringRunner.class) 就解决了这个问题。

就我而言,我导入了 org.junit.Test 而不是较新的 org.junit.jupiter.api.Test

如果您使用 Maven,则可以避免犯此错误,从 junit-vintage-engine 依赖项中排除 spring-boot-starter-test

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
    <exclusions>
        <exclusion>
            <groupId>org.junit.vintage</groupId>
            <artifactId>junit-vintage-engine</artifactId>
        </exclusion>
    </exclusions>
</dependency>