public class Customer {
...
public Customer(...) {
validate(...);
...
}
private void validate(...) {
...
}
}
테스트코드에서 Configuration을 한 다음 @Autowired로 의존 객체를 주입한다.
@Configuration
@ComponentScan(basePackages = {"org.prgrms.kdt.customer"})
static class Config {
@Bean
public DataSource dataSource() {
var dataSource = DataSourceBuilder.create()
.url(...)
.username(...)
.password(...)
.type(HikariDataSource.class)
.build();
// thread_connected, thread_created 수 늘려보기
dataSource.setMaximumPoolSize(1000);
dataSource.setMinimumIdle(100);
return dataSource;
}
}
@Autowired
TestRepository testRepository;
@Autowired
DataSource dataSource;
@Test
@DisplayName(...)
public void test() {
var test = testRepository.test();
assertThat(test, is(false));
}
@BeforAll을 사용하면 테스트 시작전에 해당 method를 사용 할 수 있다.
@TestInstance를 사용하면 @BeforAll이 있는 method를 static없이 사용 할 수 있다.
@Order(...)과 @TestMethodOrder를 사용하면 @Order 순서대로 테스트가 실행된다.
@SpringJUnitConfig
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class Test {
@BeforeAll
void setup(){ ... }
@Test
@Order(1)
void test1{ ... }
@Test
@Order(2)
void test1{ ... }
}
아래와 같이 datasource를 만든 후, jdbctemplate를 만들면 준비는 끝난다.
connection을 열고 statement를 생성 후 resultset을 만드는 과정을 jdbctemplate이 대신 해준다.
HikariDataSource dataSource = DataSourceBuilder.create()
.url("jdbc:mysql://localhost/order_mgmt")
.username("root")
.password("1234")
.type(HikariDataSource.class)
.build();
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
// for upgrade uuid version3 to version4
static UUID toUUID(byte[] bytes) {
var byteBuffer = ByteBuffer.wrap(bytes);
return new UUID(byteBuffer.getLong(), byteBuffer.getLong());
}
// insert
public Tester insert(Tester tester) {
var executeUpdate = jdbcTemplate.update("INSERT INTO tester(id, name, email, created_at) VALUES (UUID_TO_BIN(?), ?, ?, ?)",
tester.getId().toString().getBytes(),
tester.getName(),
tester.getEmail(),
Timestamp.valueOf(tester.getCreatedAt())
);
if (executeUpdate != 1) {
throw new RuntimeException("Nothing was inserted");
}
return tester;
}
// rowmapper for get query result
RowMapper<Tester> testerRowMapper = (resultSet, i) -> {
var id = toUUID(resultSet.getBytes("id"));
var name = resultSet.getString("name");
var email = resultSet.getString("email");
var lastLoginAt = resultSet.getTimestamp("last_login_at") != null ?
resultSet.getTimestamp("last_login_at").toLocalDateTime() : null;
var createdAt = resultSet.getTimestamp(
"created_at").toLocalDateTime();
return new Tester(id, name, email, lastLoginAt, createdAt);
};
// select all
public List<Tester> findAll() {
return jdbcTemplate.query("select * from testers", testerRowMapper);
}
// find by id
public Optional<Tester> findById(UUID id) {
try {
return Optional.ofNullable(jdbcTemplate.queryForObject("SELECT * FROM testers WHERE id = UUID_TO_BIN(?)",
testersRowMapper, id.toString()));
} catch (EmptyResultDataAccessException e) {
return Optional.empty();
}
}