DBUnit i dane w formacie JSON

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.

2 myśli na temat “DBUnit i dane w formacie JSON

  1. 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

  2. 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.

Napisz odpowiedź

Twój adres e-mail nie zostanie opublikowany.

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax