주요글: 도커 시작하기

DB를 사용하는 기능에 대한 통합 테스트를 진행하려면 테스트할 상황에 맞게 데이터를 구성해야 한다. 예를 들어 주문의 상태를 변경하는 기능을 통합 테스트한다고 하자. 이 경우 주문이 DB에 존재해야 상태가 올바르게 바뀌는지 확인할 수 있다. 즉 테스트 대상 기능을 실행하기 전에 DB에 테스트할 상황에 맞는 데이터를 INSERT 해야 한다. 이를 위해 다음과 같은 보조 클래스를 만들어 사용하면 테스트 코드 작성이 조금 편리해진다.

public class OrderGivenHelper {
    private JdbcTemplate jdbcTemplate;
    
    public OrderGivenHelper(DataSource dataSource) {
    	this.jdbcTemplate = new JdbcTemplate(dataSource);
    }
    
    public void givenOrder(Order order) {
        List<String> cols = new ArrayList<>();
        List<Object> values = new ArrayList<>();
        if (order.getId() != null) {
            cols.add("order_id");
            values.add(order.getId());
        }
        if (order.getTotalAmount() != null) {
            cols.add("total_amount");
            values.add(order.getTotalAmount());
        }
        if (order.getStatus() != null) {
            cols.add("status");
            values.add(order.getStatus());
        }

        ...생략
        String insCols = cols.stream().collect(Collectors.joining(",", "(", ")"));
        String bindParams = cols.stream().map(x -> "?").collect(Collectors.joining(",", "(", ")"));
        jdbcTemplate.update("insert into PURCHASE_ORDER " + insCols + " values " + bindParams,
                values.toArray());
    }
    
    public void clearOrder() {
    	jdbcTemplate.update("delete from PURCHASE_ORDER");
    }
}

위 헬퍼를 사용하면 giveOrder() 메서드에 전달할 Order 객체를 생성할 때 INSERT 쿼리를 실행할 때 NOT NULL인 필수 값만 지정하면 된다.

 

통합 테스트 코드는 위 코드를 사용해서 상황에 맞는 테스트를 실행한다.

@SpringBootTest
public class OrderTest {
    @Autowired
    private OrderCancelService cancelService;
    @Autowired
    private OrderRepository repo;
    private OrderGivenHelper givenHelper;
    private DataSource dataSource = ...생략;

    @BeforeEach
    public void setUp() {
        givenHelper = new OrderGivenHelper(dataSource);
    }
    
    public void cancelOrder() {
        givenHelper.clearOrder();
        givenHelper.givenOrder(Order.builder().id(10L).status(PAID).build());
        
        cancelService.cancelOrder(10L);
        
        Order order = repo.findById(10L);
        assertThat(order.getStatus()).isEqualTo(CANCEL);
    }
}

 

+ Recent posts