source

스프링 부트 MVC 테스트 - MockMvc는 항상 null입니다.

bestscript 2023. 3. 1. 11:17

스프링 부트 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 자체가 null임을 확인할 수 있습니다.따라서 예외 메시지가 알려주는 것은 "java.lang"뿐입니다.특수한 포인터예외입니다.

Spring 초기화와 관련이 있지만 효과가 없는 경우를 대비하여 테스트 클래스에 "@SpringBootTest" 또는 "@RunWith(SpringRunner.class)"와 같은 더 일반적인 Spring Boot 주석을 추가하려고 이미 시도했습니다.

이상하네, 너도 같이 해 봤다면@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")));
    }
}

여기에서 샘플 완성

또한 Spring 문서에 자세히 나와 있듯이 @WebMvcTest 및 @AutoConfigureMockMvc 주석 사용에 대한 다음 의견을 고려해 보는 것이 좋습니다.

기본적으로는 @WebMvcTest에서 주석을 단 테스트에서는 Spring Security 및 MockMvc(HtmlUnit WebClient 및 Selenium WebDriver 지원 포함)도 자동으로 설정됩니다.MockMVC를 보다 세밀하게 제어하려면 @AutoConfigureMockMvc 주석을 사용할 수 있습니다.

일반적으로 @WebMvcTest는 @MockBean 또는 @Import와 조합하여 @Controller bean에 필요한 콜라보레이터를 만듭니다.

전체 애플리케이션 구성을 로드하고 MockMVC를 사용하려면 @SpringBoot을 고려해야 합니다.이 주석이 아닌 @AutoConfigureMockMvc와 결합된 테스트입니다.

JUnit 4를 사용할 경우 이 주석을 @RunWith(SpringRunner.class)와 함께 사용해야 합니다.

저도 같은 문제에 직면했어요.알고 보니MockMvc호환되지 않는 주석으로 인해 주입되지 않았습니다.Import는org.junit.Test, 단, 로 변경합니다.org.junit.jupiter.api.Test문제를 해결했습니다.

수락된 답변은 가능하지만 Import하지 않고 문제를 해결했습니다.@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>

최신 또는 최소한 최신 버전이 있는지 확인합니다.maven-surefire-plugin그것은 문제를 해결하는 데 도움이 되었다.

언급URL : https://stackoverflow.com/questions/59534247/spring-boot-mvc-test-mockmvc-is-always-null