Aplikační kontext pro spring obsahuje klasické připojení k DB:
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource" method="close">
<property name="driverClassName"
value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="..."/>
<property name="username" value="..."/>
<property name="password" value="..."/>
<property name="initialSize" value="..."/>
<property name="maxActive" value="..."/>
<property name="maxIdle" value="..."/>
</bean>
(není úplně klasické - pro Oracle je samozřejmě použit příslušný ovladač)
Dále ukázka XML s testovaným obsahem:
<table name="foo">
<column>ID</column>
<column>EVENT_TIME</column> <!-- formát yyyy-mm-dd hh:mm:ss -->
<row>
<value>111</value>
<value>2008-06-05 17:44:00</value>
</row>
</table>
Test je jednoduchý:
assertEquals("17:44", bar.getCas());
Nemilé překvapení mě čekalo, když jsem test spustil a metoda getCas() vrátila prázdný řetězec. Po delším debugování zdrojáků DbUnitu jsem dospěl k závěru, že problém bude ve třídě
org.dbunit.dataset.datatype.DateDataType a mapováním Date na Timestamp. Navrhl jsem jednoduché řešení a úpravu této třídy tak, aby vracela to co potřebuji. A toto řešení se mi zdálo dobré až do doby, než jsem zjistil, že jsem přehlédl jinou a podstatnou třídu org.dbunit.dataset.datatype.TimestampDataType. Začal jsem uvažovat, na co tam asi je, když se do ní při vytváření schématu DB nedostanu.
Hlava mapa a kdo hledá ten najde. Na stránkách ve FAQ DbUnitu je řešení (připomínám, že pracuji s Oraclem a mapování Date a Timestamp mezi Oraclem a klasickým JDBC je specifické - a DbUnit používá v základu JDBC specifikaci).
Nakonec tedy stačilo přidat kouzelný řádek hned za vytvoření connection:
connection.getConfig().setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new OracleDataTypeFactory());
Mapování datových typů Timestamp poté probíhá ve zmíněné třídě org.dbunit.dataset.datatype.TimestampDataType a test projde bez problémů.
("Kdo nemá v hlavě, ten má v nohách" - v mém případě to chce jen příště dobře prostudovat dokumentaci)
