-
DBUnit 에서 데이터셋을 읽을 때 지정단어를 치환하자.
-
아마 그런 기능이 이미 있을거야.
-
AbstractDataSetLoader
추상클래스를 구현한다.NowReplacementDataSetLoader
public class NowReplacementDataSetLoader extends FlatXmlDataSetLoader { private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss"); @Override protected IDataSet createDataSet(Resource resource) throws Exception { return createReplacementDataSet(super.createDataSet(resource)); } private IDataSet createReplacementDataSet(IDataSet dataSet) { ReplacementDataSet replacementDataSet = new ReplacementDataSet(dataSet); LocalDateTime oneClockAtToday = LocalDateTime.now().withHour(1).withMinute(0).withSecond(0).withNano(0); replacementDataSet.addReplacementObject("[NOW-366]", oneClockAtToday.minusDays(366).format(DATE_TIME_FORMATTER)); replacementDataSet.addReplacementObject("[NOW-364]", oneClockAtToday.minusDays(364).format(DATE_TIME_FORMATTER)); replacementDataSet.addReplacementObject("[NOW-30]", oneClockAtToday.minusDays(30).format(DATE_TIME_FORMATTER)); replacementDataSet.addReplacementObject("[NOW-1]", oneClockAtToday.minusDays(1).format(DATE_TIME_FORMATTER)); return replacementDataSet; } }
위와 같은 형태로 AbstractDataSetLoader
를 확장하여 사용하려는 항목을 선언해둔다. 위의 코드에서는 XML 내에 [NOW-366]
, [NOW-364]
, [NOW-30]
, [NOW-1]
에 대해서 각각 지정된 날짜로 변환하도록 정의하고 있다. 이렇게 선언해두고 테스트에서 NowReplacementDataSetLoader
을 사용하도록 지정한다.
DBunit 테스트 예제
@EnableConfigurationProperties
@ActiveProfiles({"db-h2"})
@RunWith(SpringRunner.class)
@Transactional
@SpringBootTest(webEnvironment = NONE, classes = {DBConfig.class})
@TestExecutionListeners({DependencyInjectionTestExecutionListener.class, DirtiesContextTestExecutionListener.class,
TransactionalTestExecutionListener.class, DbUnitTestExecutionListener.class})
@DbUnitConfiguration(databaseConnection = {"DataSource"}, dataSetLoader = NowReplacementDataSetLoader.class) // (1)
public class UserRepositoryTest {
@Autowired
UserRepository userRepository;
@Test
@DatabaseSetup(value = { "/dbunit/insert-user.xml"})
public void testFindBizpointSupplier() {
LocalDateTime now = LocalDateTime.now().withHour(1).withMinute(1);
List<UserDto> users = userHistoryRepository.findByCreated(now.minusDays(31), now);
assertThat(suppliers).hasSize(2);
}
}
-
@DbUnitConfiguration
의dataSetLoader
으로NowReplacementDataSetLoader
를 사용하도록 정의한다.
그후 사용하는 데이터셋 XML 내에 파일 다음과 같은 형태로 작성한다.
+
./dbunit/insert-user.xml
<dataset>
<user id="1" username="test1@honeymon.io" created="[NOW-366]"/>
<user id="2" username="test2@honeymon.io" created="[NOW-364]"/>
<user id="3" username="test3@honeymon.io" created="[NOW-30]"/>
<user id="4" username="test4@honeymon.io" created="[NOW-1]"/>
</dataset>
으로 정의해두면 dbunit이 실행되면서 /dbunit/insert-user.xml
를 읽을 때 NowReplacementDataSetLoader.class
를 통해서 대체작업을 진행한다.