bestsource

SpringBoot를 통해 SpringBoot 응용 프로그램을 디버깅하는 방법시험

bestsource 2023. 7. 23. 14:32
반응형

SpringBoot를 통해 SpringBoot 응용 프로그램을 디버깅하는 방법시험

저는 스프링부츠가 처음이고 특히 보일러 플레이트 코드를 제거하는 것을 좋아합니다.테스트할 테스트 클래스를 만들었습니다.NBRController:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = NewBusinessRevitalizationApplication.class, 
    webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@TestPropertySource(properties = {"management.port=0"})
public class NBRControllerTest extends TestCase {

    @LocalServerPort
    private int port;

    @Value("${local.management.port}")
    private int mgt;

    @Autowired
    private TestRestTemplate testRestTemplate;

    @Test
    public void getApplicationByAgencyIdAndStatusTest() {
        String uri = "http://localhost:" + this.port + "/nbr-services/applications/{status}?agencyIds=123456,56765,678576";
        Map<String, String> vars = new HashMap<String, String>();
        vars.put("status", "SAVED");
        ResponseEntity<String> response = testRestTemplate.getForEntity(uri, String.class, vars);
        assertEquals(HttpStatus.OK, response.getStatusCode());
    }
}

디버그 모드에서 실행하면 테스트 클래스만 디버그할 수 있습니다.NBRController클래스:

@RestController
@RequestMapping("/nbr-services")
public class NBRController {

    @Autowired
    private NBRServices nbrServices;

    private static Logger logger = LoggerFactory.getLogger(NBRController.class);

    @RequestMapping(value = "/configuration/environment/{environment}", method = RequestMethod.GET)
    @ResponseBody
    public String getConfiguration(@PathVariable("environment") String environment) throws RemoteException {
        logger.debug("environment={}", environment);
        String result = nbrServices.getConfiguration(environment);
        return result;
    }
}

Tomcat 디버그 포트를 설정하려고 했지만 실패했습니다.디버그할 수 있는 유일한 방법은NBRController디버깅 모드에서 실행하고 브라우저에서 RestAPI를 호출하지만 장치 테스트를 사용하려고 합니다.잘 부탁드립니다!

제가 실수로 같은 경로 매핑을 가진 두 개의 컨트롤러 메소드를 가지고 있었을 때 이런 일이 있었습니다.

디버깅을 위한 다른 대안:

mockMVC를 사용하여 서버만 mock

split webEnvironment를 사용하지 않고 spring MockMVC를 사용하여 http 호출 대신 컨트롤러에 직접 메서드 호출을 수행하여 시스템을 디버그할 수 있습니다.

@SpringBootTest(
   webEnvironment = SpringBootTest.WebEnvironment.MOCK // this is the default
)
@AutoConfigureMockMvc
class MyTest {

  @Autowired
  private MockMvc mockMvc;

  @Test public void myTest() {
     mockMvc.perform("/mypath");
     // ...
  }
}

이렇게 하면 실제로 jUnit 클래스와 컨트롤러 간에 http를 호출하지 않으므로 이 http 처리 부분은 테스트되지 않습니다.

서버를 개별적으로 시작하고 원격 디버거 연결

  1. IDE에서 애플리케이션 캔을 디버깅 모드로 시작합니다.
  2. 응용 프로그램이 실행 중이면 RestAssured와 같은 http 클라이언트가 포함된 Junit 테스트를 시작합니다.

이렇게 하면 2개의 JVM이 생성되지만 IDE는 두 개 모두에 연결되므로 모든 중단점이 작동합니다.

Intellij 2020.3을 사용하고 있으며 컨트롤러를 디버깅할 수 있습니다.

  1. intelli. 2에서 실행 중인 모든 인스턴스를 중지합니다.디버그 포인터를 올바른 컨트롤러 방법에 넣고 디버그 모드에서 테스트 케이스를 실행하기만 하면 됩니다.
  2. 잘못된 끝점에 도달하지 않는 한 작동해야 합니다.
  3. 또한 debug 모드에서 testRestTemplate 호출이 네트워크 자체에서 실패하는 경우를 대비하여 테스트 사례에서 testRestTemplate 호출을 평가할 수 있습니다.

현재 사용 중인 포트와 다른 포트에서 실행되고 있을 수 있습니다.

스프링 부츠테스트 주석은 테스트 포트를 제어하는 것입니다.

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)

URI에서 http://local host +port를 추가할 필요는 없지만 testRestTemplate가 대신 추가합니다.그것을 제거하고 디버그 지점을 클릭해 보십시오.

다음은 Spring boot 2 + JUNIT 5의 Rest Layer에 Junit를 쓰는 예입니다.

@ExtendWith(MockitoExtension.class)
public class RestTest {

    @InjectMocks
    private Rest  rest;
    
    private MockMvc mockMvc;
    
    @BeforeEach
    public void init() throws Exception {
        MockitoAnnotations.initMocks(this);
        mockMvc = MockMvcBuilders.standaloneSetup(rest).build();
    }
    
    @Test
    public void getTest() throws Exception {
        String url = "/test";
        ResultActions resultActions = mockMvc.perform(get(url));
        resultActions.andExpect(status().isOk());

    }
    
}

    @RestController
    @RequestMapping(value = "/test", produces = MediaType.APPLICATION_JSON_VALUE)
    public class Rest  {
    
        
        
        @GetMapping
        public @ResponseBody String get()  {
            
            return "success";
        }
        }

저는 개인적으로maven-spring-boot플러그인과 디버깅하면 메이븐 실행 구성에서 나옵니다.그게 당신이 하고 있는 일의 잘못된 점인가요?maven-spring-boot플러그인은 테스트 단계 중에 테스트가 실행되기 전에 스프링 부트 서버를 시작합니다.

명령줄 앱으로 실행하려면 테스트를 실행하기 전에 Spring 컨텍스트를 수동으로 로드하고 코드 두 줄에서 메인 클래스를 실행해야 합니다.나는 그것을 어떻게 하는지 즉석에서 기억하지 못합니다.

언급URL : https://stackoverflow.com/questions/42027295/how-to-debug-a-spring-boot-application-via-springboottest

반응형