Skip to content

Instantly share code, notes, and snippets.

@ihoneymon
Created August 9, 2018 10:01
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ihoneymon/5556cf953e119eec2628b649f76cf9a5 to your computer and use it in GitHub Desktop.
Save ihoneymon/5556cf953e119eec2628b649f76cf9a5 to your computer and use it in GitHub Desktop.
DBUnit 데이터셋 지정단어 치환하기

DBUnit XML 지정단어 치환하기

착안점

해결방법

  • springdbunit은 DataSetLoader를 통해서 읽어온 데이터셋을 제어할 수 있는 방법을 제공한다.

사용방법

  1. 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);
    }
}
  1. @DbUnitConfigurationdataSetLoader 으로 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를 통해서 대체작업을 진행한다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment