Sangil's blog

https://github.com/ChoiSangIl Admin

Spring Boot RestTemplate 테스트(MockServer) DEV / WEB

2021-12-30 posted by sang12


Spring Boot에서 RestTemplate 호출(PUT)을 테스트하는 방법은 아래와 같다. 

RestTemplate객체를 MockServer의 인자값으로 넘겨 RestTemplate Mock서버를 만들어주고

호출하는 URL과 리턴받을 값을 설정 해준다. 그리고 RestTemplate로 호출해주면 된다.

PUT 메서드를 호출하려고 하니 template.put으로 호출하면 결과 값을 받아오지 못해서 exchange 함수를 사용하였다.

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.springframework.test.web.client.match.MockRestRequestMatchers.method;
import static org.springframework.test.web.client.match.MockRestRequestMatchers.requestTo;
import static org.springframework.test.web.client.response.MockRestResponseCreators.withStatus;

import java.net.URI;
import java.net.URISyntaxException;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.test.web.client.ExpectedCount;
import org.springframework.test.web.client.MockRestServiceServer;
import org.springframework.web.client.RestTemplate;

@SpringBootTest
public class OrderServiceImplTest {

	@Autowired
	private RestTemplate template;

	private MockRestServiceServer mockServer;

	@BeforeEach
	public void init() throws URISyntaxException {
		mockServer = MockRestServiceServer.createServer(template);
		mockServer.expect(ExpectedCount.once(), 
		          requestTo(new URI("http://localhost:8083/product/stock/order")))
		          .andExpect(method(HttpMethod.PUT))
		          .andRespond(withStatus(HttpStatus.OK)
		          .contentType(MediaType.APPLICATION_JSON)
		          .body("minus stock..."));            
	}

	@Test
	public void testOrder() throws URISyntaxException {
	    HttpHeaders headers = new HttpHeaders();
	    headers.setContentType(MediaType.APPLICATION_JSON);
	    HttpEntity<String> entity = new HttpEntity<String>("", headers); 

	    ResponseEntity<String> response = template.exchange("http://localhost:8083/product/stock/order", HttpMethod.PUT, entity, String.class);
	    assertEquals("minus stock...", response.getBody());
	}
}

* 그리고 Autowried를 사용하여 RestTemplate 객체를 di 받아 왔는데 굳이 테스트를 위해 스프링을 올려가며 받아 와야 하나 싶다. 그래서 @Autowried 어노테이션을 제거하고 직접 RestTemplate객체를 생성하여 넣어주고 @SpringBootTest 어노테이션도 제거했다.

template = new RestTemplate();
mockServer = MockRestServiceServer.bindTo(template).build();

REPLY

datatable checkbox click event DEV / WEB

2021-06-18 posted by sang12


datatable을 사용하여 체크 박스를 사용하는데, 로우를 클릭할때마다 특정 이벤트를 만들고 싶었는데 방법을 찾는데 한참 헤매었다.
아래와 같이 row가 select 됐을때 이벤트를 사용 할 수 있다.

table.on'select'function ( edttypeindexes ) {
        if ( type === 'row' ) {
            var data = saleProductTable.rowsindexes ).data();
            alert(JSON.stringify(data[0]));
        }
} );    
REPLY

pm2 jenkins 배포 오류 DEV / WEB

2021-05-26 posted by sang12


기존 리눅스 서버에 express 서버를 1개 사용하고 있었는데 추가로 1개 더 셋팅하려고 하다가 발생한 문제
Jenkins를 이용해서 배포하고있었는데, 기존에 쉘 명령어는 아래와 같았다.  

pm2 kill
pm2 start

ㅎㅎ 뭔가 느껴지지 않는가... 
기존에 새로 추가한것도 동일하게 셋팅하니 pm2 kill을 호출하면서 pm2로 올라가있는 전체 프로세스를 죽이는 것..
하나를 배포하면 한놈은 죽고 다른놈만 올라가는 상황 발생.

그래서 생각한 방법이 --name을 줘서 해당되는놈만 삭제하고 올리자 라고 해서 부랴부랴 start할때 --name옵션을 넣어줬다.
잘되는가 싶더니.....
pm2 stop target을 할때 target이 존재하지 않으면 젠킨스에서 오류를 뿜어낸다... 
스크립트로 만들어야 되나라는 생각이 스쳐지나갈쯤... 구원투수 등판 (
https://github.com/Unitech/pm2/issues/325)
젠킨스에서 오류가 날때 오류코드를 리턴 안하게 하면된다.

-해결방법

pm2 stop -s app || :
pm2 delete -s app || :
set DEBUG=express:* & pm2 start ./bin/www --name app

-s 옵션만 넣으면 리눅스에서 오류는 나오지 않으나 젠킨스에서 동일한 오류가 발생한다. || :을 넣어주면 실행후 null을 리턴해줘서 젠킨스에서 오류라고 생각하지 않는듯하다..!

REPLY