Sangil's blog

https://github.com/ChoiSangIl Admin

Spring Kotest 설정 및 다양한 testing style 지원 DEV / WEB

2022-09-14 posted by sang12


Gradle 의존성 설정

testImplementation("io.kotest:kotest-runner-junit5:5.4.2")
testImplementation("io.kotest:kotest-assertions-core:5.4.2")
testImplementation("io.kotest.extensions:kotest-extensions-spring:1.1.2")

testImplementation("io.kotest.extensions:kotest-extensions-spring:1.1.2")

해당 의존성을 설정해야 @Autowired와 같은 Spring 기능등을 사용하여 테스트 할 수 있다. Gradle 버전 마다 Setting 하는 방법이 다르므로 버전및 셋팅은 공식 페이지를 참고하자. (https://kotest.io/docs/quickstart )

다양한 testing style 지원

아래와 같이 다양한 testing style을 지원 한다.


참고 : https://kotest.io/docs/framework/testing-styles.html

ShouldSpec

@SpringBootTest
class BlogApplicationKtShouldSpec(
    @Autowired private val context: ApplicationContext
) : ShouldSpec({
    should("Spring Boot 서비스가 실행 됐을경우, ApllicationContext 객체를 반환해야 한다"){
        context shouldNotBe null
    }
})

BehaviorSpec

@SpringBootTest
class BlogApplicationKtBehaviorSpec(
    @Autowired private val context: ApplicationContext
) : BehaviorSpec({
    given("context 객체가 주어 졌을 때") {
        `when`("스프링부트 서비스가 올라갈 때") {
            then("context 객체를 반환해야한다") {
                context shouldNotBe null
            }
        }
    }
})

항상 junit으로 테스트 할 때… //given //when //then 을 주석으로 명시해주고 사용 했었다. 뭔가 더 직관적이다!

WorldSpec

@SpringBootTest
class BlogApplicationKtWordSpec(
    @Autowired private val context: ApplicationContext
) : WordSpec({
    "context 객체" should {
        "return not null" {
            context shouldNotBe null
        }
    }
})

StringSpec

@SpringBootTest
class BlogApplicationKtTest(
    @Autowired private val context: ApplicationContext
) : StringSpec({
    "Spring Boot 서비스가 실행 됐을경우, ApllicationContext 객체를 반환해야 한다" {
        context shouldNotBe null
    }
})
#kotest @Autowired
REPLY

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