programing

스프링 부트 유닛 테스트 자동 전원 공급

testmans 2023. 3. 11. 08:45
반응형

스프링 부트 유닛 테스트 자동 전원 공급

다음과 같은 수업이 있습니다.

Application And Configuration 클래스

package mypackage.service;

import mypackage.service.util.MyUtility;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class ApplicationAndConfiguration {


    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(ApplicationAndConfiguration.class, new String[]{});
    }

    @Bean(initMethod="init")
    public MyUtility birtUtil() {
        return new MyUtility();
    }
}

MyRestController 클래스

package mypackage.service.controllers;

import mypackage.service.util.MyUtility;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyRestController {

    @Autowired
    private MyUtility util;

    @RequestMapping("/getLibraryName")
    public String getMessageFromRest(@RequestParam String name) {

        return "name was " + name + "//" + util.getMessage();
    }   
}

MyUtility 클래스

package mypackage.service.util;

public class MyUtility {

    private String message;

    public void init() {
        setMessage("MyUtility correctly initialized!");
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

어플리케이션을 기동해, 독립형 jar 또는 IDE(Eclipse)로부터 실행하면, 전혀 문제가 없고, 모든 것이 정상적으로 동작합니다.

단, MyRestController 클래스를 테스트하기 위한 유닛테스트를 작성하고 싶은데 (MyRestController 클래스 내) Autowired 필드 util이 null이기 때문에 NPE를 받습니다.

시험 수업은 다음과 같습니다.

package mypackage.service.controllers;

import static org.hamcrest.Matchers.equalTo;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import mypackage.service.ApplicationAndConfiguration;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;

@SpringApplicationConfiguration(classes = ApplicationAndConfiguration.class)
@WebAppConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
public class TestController {

    private MockMvc mvc;

    @Before
    public void setup() throws Exception {
        mvc = MockMvcBuilders.standaloneSetup(new MyRestController()).build();
    }

    @Test
    public void MyTestController() throws Exception {

        mvc.perform(MockMvcRequestBuilders.get("/getLibraryName").param("name", "test").accept(MediaType.APPLICATION_JSON))
        .andExpect(status().isOk())
        .andExpect(content().string(equalTo("name was test//MyUtility correctly initialized!")));
    }
}

표준 어플리케이션 실행 중뿐만 아니라 테스트 중에 자동 요구 필드가 채워질 정도로 확실히 부족한 점이 있습니다.

왜 작동하지 않는지 포인터라도 있나요?

Spring Boot 1.4 이후 모든 클래스가 변경되어 https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-1.4.0-M2-Release-Notes가 폐지되었습니다.Runner 및 Configuration을 다음 것으로 교체합니다.Spring Runner가 테스트 프레임워크를 검출합니다.

@RunWith(SpringRunner.class)
@SpringBootTest(classes = { FileService.class, AppProperties.class, DownloadConfigEventHandler.class })
@EnableConfigurationProperties
public class ConfigMatrixDownloadAndProcessingIntegrationTests extends ConfigMatrixDownloadAbstractTest {

  // @Service FileService
  @Autowired
  private FileService fileService;

  // @Configuration AppProperties
  @Autowired
  private AppProperties properties;

  // @Compoenet DownloadConfigEventHandler
  @Autowired
  private DownloadConfigEventHandler downloadConfigEventHandler;    
  ..
  ..
}

이 모든 인스턴스는 예상대로 자동 전원 공급됩니다.퍼블리셔와의 봄 이벤트도 https://spring.io/blog/2015/02/11/better-application-events-in-spring-framework-4-2에서 예상대로 동작하고 있습니다.

MockMvc 스탠드아론 셋업은 유닛 테스트용입니다.테스트에서 스프링 콘텍스트를 작성할 때 통합 테스트를 수행합니다.이 두 가지 유형의 테스트를 혼용하지 마십시오.

이 방법으로 변경해 주세요.

@SpringApplicationConfiguration(classes = ApplicationAndConfiguration.class)
@WebAppConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
public class TestController {

    private MockMvc mvc;

    @Autowired
    private WebApplicationContext webApplicationContext;

    @Before
    public void setup() throws Exception {
        mvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
    }

언급URL : https://stackoverflow.com/questions/34436664/spring-boot-unit-test-autowired

반응형