TDD 또는 Test
통합 테스트에서 INSERT 쿼리 위한 보조 클래스
madvirus
2020. 7. 20. 11:48
반응형
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);
}
}