W standardowej dystrybucji DBUnit nie ma możliwości załadowania danych w formacie JSON. Nie mi rozsądzać czy to dobrze czy to źle, ale jako, że nie ma to będzie.
Do prawidłowego działania wymagana jest biblioteka google-gson:
Listing 1. Konfiguracja w pom.xml
com.google.code.gson gson 2.2.1
Oraz klasa narzędziowa z poprzedniego wpisu.
Listing 2. Klasa JsonDataSet
public class JsonDataSet extends AbstractDataSet { private class JsonTable { private String[] columns; private String name; private String[][] rows; public String[] columns() { return columns; } public String name() { return name; } public String[][] rows() { return rows; } } private final OrderedTableNameMap _tables; private JsonTable[] tables; private JsonDataSet() { _tables = super.createTableNameMap(); } @Override protected ITableIterator createIterator(boolean reversed) throws DataSetException { @SuppressWarnings("unchecked") ITable[] tables = (ITable[]) _tables.orderedValues().toArray(new ITable[0]); return new DefaultTableIterator(tables, reversed); } private JsonDataSet init() throws DataSetException { for (JsonTable jsonTable : tables) { ITable iTable = table(jsonTable.name(), jsonTable.columns(), jsonTable.rows()); _tables.add(iTable.getTableMetaData().getTableName(), iTable); } return this; } public static JsonDataSet build(Reader jsonReader) throws DataSetException { JsonDataSet fromJson = new Gson().fromJson(jsonReader, JsonDataSet.class); return fromJson.init(); } public static JsonDataSet build(String jsonString) throws DataSetException { final JsonDataSet fromJson = new Gson().fromJson(jsonString, JsonDataSet.class); return fromJson.init(); } }
Listing 3. Przykładowe dane
{"tables":[ {"name":"AIO","columns":["name","pass"],"rows":[["a","b"],["aa","bb"]]}, {"name":"SimpleUser","columns":["name","password"],"rows":[["a","b"],["aa","bb"]]} ]}
i
Listing 4. Przykładowe zastosowanie
forDB("org.hsqldb.jdbcDriver", // "jdbc:hsqldb:file:src/test/resources/db/unit-testing-jpa", // "sa", "") // .cleanInsert(JsonDataSet.build( // new FileReader(new File("src/test/resources/simplejsontable")) // ));
Wieczorem opakuje to może w jakiś projekt i umieszczę na Google Code.
Uważam , że ogólnie napychanie bazy w testach przez DBUnit to „ZŁO” w sytuacji kiedy model twojej bazy żyje/ciągle się zmienia
A kto mówi o zapychaniu? Jeżeli nie wykorzystujesz jakiś dziwnych ficzerów typu procedury składowane to można w testach spokojnie wykorzystać HSQLDB w trybie memory. A sam przyznasz, że np. testowanie zapytań budowanych za pomocą Criteria API jest dobrym pomysłem.