본문 바로가기

Programming/Java

junit 예시 (get, post, patch, delete, exchange, assert)

시작하기 전에

불친절하지만 누군가에게 도움이 될 junit 예시이다.

class Something

아래와 같은 Something class를 DTO로 사용한다고 하자.

public class Something { 
    private String id; 
    private String name; 
    private String desc; 
}

constructor, getter, setter 등은 생략했다.

junit Test

메소드의 parameter들에 대한 설명은 다른 곳에서 볼 수 있으므로 생략한다.

getForEntity

    @Test
    public void getSomethingTest() {
        int somethingId = 26;
        ResponseEntity<JSONObject> response = restTemplate.getForEntity("/something/{somethingId}", JSONObject.class, somethingId);

        // 결과로 받은 Http Status Code가 200이 아니면 assert
        assertEquals(response.getStatusCode(), HttpStatus.OK);
    }

postForEntity

    @Test
    public void postSomethingTest() 
        Something s = new Something();
        project.setName("something");
        project.setDesc("something to post");

        ResponseEntity<JSONObject> response = restTemplate.postForEntity("/something", s, JSONObject.class);
        assertEquals(response.getStatusCode(), HttpStatus.OK);
    }

patch - exchange 사용

patchForObject를 쓰려고도 해봤고.. 그렇지만 잘 되지 않아서 exchange를 사용했다.

    @Test
    public void updateSomethingDescTest() {
        int somethingId = 26;
        Something s = new Something();
        s.setDesc("patch test");

        final HttpEntity<Something> request = new HttpEntity<Something>(s);

        ResponseEntity<Void> response = restTemplate.exchange("/something/{somethingId}",
            HttpMethod.PATCH, request, Void.class, somethingId);

        assertEquals(response.getStatusCode(), HttpStatus.OK);

        // update가 정상적으로 되었는지 확인하기 위해
        // somethingDao.readSomethingBySomethingId로 받아낸 something 객체에 있는 desc와 바꾸고자 했던 desc 값이 같은지 확인
        assertEquals(s.getDesc(), somethingDao.readSomethingBySomethingId(somethingId).getDesc());
    }

delete - exchange 사용

http status code를 응답받으려면 rest template의 delete 메소드가 아닌 exchange를 써야했다.
(delete 메소드는 return type이 void)

    @Test
    public void deleteSomethingTest() {
        int somethingId;

        ResponseEntity<Void> response = restTemplate.exchange("/something/{somethingId}",
            HttpMethod.DELETE, null, Void.class, somethingId);

        assertEquals(response.getStatusCode(), HttpStatus.OK);
    }

테스트를 통해 생성된 것을 이어서 수정/삭제

뭐라고 표현해야 할 지 모르겠다 ^^.. 생성된 것의 정보로 수정/삭제 테스트?

아무튼, 테스트를 통해 생성된 어떤.. 개체?의 아이디(PK)를 바로 받아와서 바로 수정/삭제 테스트에도 사용하는 예시다.

이를 위해서는 post의 response에 방금 생성된 것의 PK가 전달되어야 하고, (여기서는 Json 가정)
그 값을 이용해 DB에서 해당 정보를 한번 더 받아와야 한다.

그래서 바꾸려고 주었던 것과 일치하는지 확인하여, 다르면 assert를 주면 된다.

    @Test
    public void createAndDeleteSomethingTest() {
        Something s = new Something();
        project.setName("something");
        project.setDesc("something to post");

        ResponseEntity<JSONObject> response = restTemplate.postForEntity("/something", something, JSONObject.class);
        assertEquals(response.getStatusCode(), HttpStatus.OK);

        // post의 결과가 생성된 Something의 ID (json 형식) 일 때 아래와 같이 delete를 이어서 테스트 할 수 있다.
        deleteSomethingTest((Integer)response.getBody().get("somethingId"));
    }

    public void deleteSomethingTest(int somethingId) {
        ResponseEntity<Void> response = restTemplate.exchange("/something/{somethingId}",
            HttpMethod.DELETE, null, Void.class, somethingId);

        assertEquals(response.getStatusCode(), HttpStatus.OK);
    }