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 처리 부분은 테스트되지 않습니다.
서버를 개별적으로 시작하고 원격 디버거 연결
- IDE에서 애플리케이션 캔을 디버깅 모드로 시작합니다.
- 응용 프로그램이 실행 중이면 RestAssured와 같은 http 클라이언트가 포함된 Junit 테스트를 시작합니다.
이렇게 하면 2개의 JVM이 생성되지만 IDE는 두 개 모두에 연결되므로 모든 중단점이 작동합니다.
Intellij 2020.3을 사용하고 있으며 컨트롤러를 디버깅할 수 있습니다.
- intelli. 2에서 실행 중인 모든 인스턴스를 중지합니다.디버그 포인터를 올바른 컨트롤러 방법에 넣고 디버그 모드에서 테스트 케이스를 실행하기만 하면 됩니다.
- 잘못된 끝점에 도달하지 않는 한 작동해야 합니다.
- 또한 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
'bestsource' 카테고리의 다른 글
Backbone.js에서 하위 뷰를 초기화하고 렌더링하는 방법은 무엇입니까? (0) | 2023.07.23 |
---|---|
한 데이터베이스/테이블에서 다른 데이터베이스/테이블로 데이터를 복사하는 방법 (0) | 2023.07.23 |
Oracle <> , != , ^= 연산자 (0) | 2023.07.23 |
PHP 출력을 변수로 캡처하려면 어떻게 해야 합니까? (0) | 2023.07.23 |
연결 시 Java 애플리케이션이 Oracle에 대해 식별되도록 하려면 어떻게 해야 합니까? (0) | 2023.07.23 |