Dies ist der Artikel zum 10. Tag von Java Adventskalender 2016 ¥ -Qiita. Der Artikel am 9. Tag war deaf_tadashis Über JMH, ein Mikro-Benchmark-Tool. Der 11. Tag ist @ leak4mk0.
Wenn Sie Testdaten (hauptsächlich Bilder oder PDF) mit DBUnit in BLOB-Spalten einfügen möchten Es gibt einen Mechanismus zum Angeben der Datei in XML.
Dieses Mal möchte ich jedoch vorstellen, wie Testdaten von EXCEL in eine Spalte vom Typ BLOB eingefügt werden.
Wenn Sie DBUnit noch nie verwendet haben, gibt es viele japanische Informationen zur Verwendung. Bitte gehen Sie herum.
Ich bin beim Importieren von BLOB-Spaltendaten gestolpert, es handelt sich also um eine Freigabe. Ich denke, es ist eine sehr seltene Situation, Du kannst diesen Weg gehen! Ich würde es begrüßen, wenn Sie das wissen könnten.
OS : Redhat 6.5 Java : 1.8.20 DB : Oracle 12c
DBUnit : 2.5.3 OJDBC : 8
In einer Umgebung, in der Unit-Test-Code ohne Gleichheit ausgeführt wird (es gibt Daten in der Datenbank, die Daten können jedoch leicht von Menschenhand geändert werden). Wenn in der Entwicklung der Testcode fehlschlägt, werden Sie aufgefordert, die Ursache zu finden und zu beheben. Dies führt Ikan und CI ein, und für Testcode, der Daten in der Datenbank enthält, kann ich diese nicht mehr reparieren Lassen Sie uns die Daten migrieren, damit sie von DBUnit importiert werden können, damit sie jederzeit aus der IDE wiederhergestellt werden können! Maße.
Wenn Sie die oben genannten Schritte ausführen, können Sie verhindern, dass der Test unterbrochen wird, außer indem Sie die Software ändern. Dies erfordert keinen zusätzlichen Aufwand. Eingeführt durch hartes Drücken auf den Punkt und den Qualitätsnutzen, der durch CI erzielt wird.
Dies wurde mit der brutalen Kraft des Kopierens von SQL Developer durchgeführt. Spaltendaten vom Typ BLOB werden kopiert und kopiert, indem eine gespeicherte Funktion ausgelöst wird, die BASE64 mit einer SELECT-Anweisung codiert.
Wenn Sie DatabaseOperation # ausführen, führen Sie DBUnit aus. ClassCastException tritt am Schreibort der BLOB-Spalte auf und die Verarbeitung schlägt fehl.
Auf der OJDBC-Seite einfach "Wenn ich Daten in eine BLOB-Spalte schreiben wollte, würde ich ein BlobObject verwenden. Sie können nicht umwandeln, da die Daten, die Sie eingeben, Bytes sind! "" Es scheint, dass.
Abgesehen vom Lesen verwende ich BlobObject nicht, wenn ich BLOB selbst schreibe, aber ich denke, dass ich es mit Gewalt in Bytes schreiben kann. Ich muss den Datentyp von org.dbunit.dataset.Column in BINARY ändern, also habe ich den folgenden Code erstellt.
Java-Code (Auszug)
IDataSet databaseDataSet = con.createDataSet();
ITableMetaData tableMetaData = databaseDataSet.getTableMetaData(tableName);
//OraclePreparedStatement versucht, ein BLOB-Objekt in eine BLOB-Spalte einzufügen.
//Ich möchte Byte-Daten festlegen, also konvertiere sie in BINARY
//Als Einschränkung ITableMetaData#Spalten und IDataSet#ITableMetaData#Mit Spalten
//Beide müssen aufgrund der doppelten Verwaltung auf BYNARY aktualisiert werden
ITable table = dataset.getTable(tableName);
Column[] cols = tableMetaData.getColumns();
for(int i = 0; i < cols.length; i++){
//Ersetzen Sie den BLOB-Typ durch BINARY
if(DataType.BLOB.equals(cols[i].getDataType())){
Column col = new Column(cols[i].getColumnName(), DataType.BINARY);
//Da die Elemente der Referenzbeziehung des Arrays frei umgeschrieben werden können, wird dies verwendet, um den Zweck zu erreichen.
cols[i] = col;
int idx = table.getTableMetaData().getColumnIndex(cols[i].getColumnName());
table.getTableMetaData().getColumns()[idx] = col;
}
}
//Datenfluss
DatabaseOperation.CLEAN_INSERT.execute(con, dataset);
Wie Sie im Kommentar sehen können, wird dies realisiert, indem das Objekt im Referenzzustand zwangsweise neu geschrieben wird.
Sie haben jetzt erfolgreich BLOB-Spaltendaten mit DBUnit in Ihre Datenbank geschrieben. Wenn Sie sich in der gleichen Situation befinden, tun Sie dies bitte!
Da die BLOB-Daten eine systemseitig erstellte Java-Instanz waren (keine PDF- oder Bilddatei, sondern der Fortschritt der Geschäftsverarbeitung) Ich habe diesen Ansatz gewählt. Erforschen Sie nicht, warum dies geschieht.
Da es viele Möglichkeiten gibt, Excel einfach wie eine Datenbank zu verwenden, Dies liegt daran, dass Sie bequem lernen können, ob der Entwickler die Daten in Excel definieren kann.
Wenn Sie DBUnit verwenden, um Daten über JDBC in eine BLOB-Spalte zu werfen, Setzen Sie den Datentyp des Spaltenfelds von ITableMetaData und IDataSet # ITableMetaData auf BINARY und es ist OK! Wir haben eine großartige Technik für alle geliefert.