어떤 예외가 던져지길 기대하고, 테스트 메서드를 여러 번 반복 실행하고, 테스트 메서드가 특정 시간 이내에 완료하는지 확인하는 등의 일반적인 테스트 작업을 진행하기
스프링이 지원하는 공통 테스트 애너테이션을 활용하면 테스트를 간결하게 작성 가능
스프링 전용 애너테이션이지만 하부 테스트 프레임워크와는 별개로 작동
일반 테스트 작업에 가장 많이 쓰이는 애너테이션들(JUnit에서만 사용 가능)
| 애너테이션 | 설명 |
|---|---|
| @Repeat | 여러 번 실행할 테스트 메서드. 반복 횟수는 애너테이션값에 지정 |
| @Timed | 테스트 메서드는 주어진 시간(밀리 초) 내에 수행. 이 시간을 초과하면 테스트는 실패. 테스트 메서드의 반복 실행 시간, 초기화/정리 메서드의 실행 시간을 합산해 지정 |
| @IfProfileValue | 특정 테스트 환경에서만 실행할 테스트 메서드. 실제 프로파일 값이 주어진 값과 일치할 경우만 실행. 여러 값을 지정해 그중 하나만 해당돼도 실행 가능. 기본적으로 SystemProfileValueSource를 이용해 시스템 프로퍼티를 프로파일 값으로 가져오지만 ProfileValueSource를 직접 구현해 @ProfileValueSourceConfiguration에 지정 가능 |
해당 애너테이션은 스프링 테스트 컨텍스트 지원 클래스 중 하나를 상속해서 사용 가능
지원 클래스를 상속하지 않고 SpringRunner 테스트 실행기로 JUnit 테스트를 실행해도 사용 가능
JUnit에서 테스트 컨텍스트 프레임워크를 이용해 테스트를 작성할 경우, SpringRunner로 테스트를 실행하거나 스프링 테스트 컨텍스트 지원 클래스를 상속하면 스프링이 제공하는 테스트 애너테이션 사용 가능
@ContextConfiguration(classes = BankConfiguration.class)
@Sql(scripts="classpath:/bank.sql")
public class AccountServiceJUnit4ContextTests extends AbstractTransactionalJUnit4SpringContextTests {
private static final String TEST_ACCOUNT_NO = "1234";
@Autowired
private AccountService accountService;
@Before
public void init() {
jdbcTemplate.update(
"INSERT INTO ACCOUNT (ACCOUNT_NO, BALANCE) VALUES (?, ?)",
TEST_ACCOUNT_NO, 100);
}
@Test
@Timed(millis = 1000)
public void deposit() {
accountService.deposit(TEST_ACCOUNT_NO, 50);
double balance = jdbcTemplate.queryForObject(
"SELECT BALANCE FROM ACCOUNT WHERE ACCOUNT_NO = ?",
Double.class, TEST_ACCOUNT_NO);
assertEquals(balance, 150.0, 0);
}
@Test
@Repeat(5)
public void withDraw() {
accountService.withdraw(TEST_ACCOUNT_NO, 50);
double balance = jdbcTemplate.queryForObject(
"SELECT BALANCE FROM ACCOUNT WHERE ACCOUNT_NO = ?",
Double.class, TEST_ACCOUNT_NO);
assertEquals(balance, 50.0, 0);
}
}