Pertanyaan Setel ulang urutan di DBUnit?


Saya ingin me-reset urutan Database AND setelah setiap tes di Java + DBUnit /.

Saya telah melihat pertanyaan ini tetapi tidak memiliki solusi kode yang saya perjuangkan. Bagaimana cara menggunakan Oracle Sequence Numbers di DBUnit?


4
2017-12-16 09:47


asal


Jawaban:


Saya telah menemukan jawabannya, itu di Dokumentasi Resmi. Itu semudah dalam dataset yang Anda gunakan untuk menyiapkan database, tambahkan a reset_sequences atribut dengan daftar yang ingin Anda atur ulang.

 <?xml version='1.0' encoding='UTF-8'?>
    <dataset reset_sequences="emp_seq, dept_seq">
        <emp empno="1" ename="Scott" deptno="10" job="project manager" />
        ....
    </dataset>

Solusi ini tidak berfungsi dengan sempurna, karena tidak benar-benar mengatur ulang urutan, hanya mensimulasikan ulang pada baris yang dimasukkan. Jika Anda ingin meresetnya secara efektif, Anda harus menjalankan beberapa perintah. Saya telah memperluas DatabaseOperation untuk tujuan itu dengan kelas ini.

public static final DatabaseOperation SEQUENCE_RESETTER_POSTGRES = new DatabaseOperation() {
    @Override
    public void execute(IDatabaseConnection connection, IDataSet dataSet)
            throws DatabaseUnitException, SQLException {
        String[] tables = dataSet.getTableNames();
        Statement statement = connection.getConnection().createStatement();
        for (String table : tables) {
            int startWith = dataSet.getTable(table).getRowCount() + 1;
            statement.execute("alter sequence " + table + "_PK_SEQ RESTART WITH "+ startWith);

        }
    }
};

public static final DatabaseOperation SEQUENCE_RESETTER_ORACLE = new DatabaseOperation() {
    @Override
    public void execute(IDatabaseConnection connection, IDataSet dataSet)
            throws DatabaseUnitException, SQLException {
        String[] tables = dataSet.getTableNames();
        Statement statement = connection.getConnection().createStatement();
        for (String table : tables) {
            int startWith = dataSet.getTable(table).getRowCount() + 1;
            statement.execute("drop sequence " + table + "_PK_SEQ if exists");
            statement.execute("create sequence " + table + "_PK_SEQ START WITH " + startWith);
        }
    }
};

11
2017-12-16 10:31



Saya telah menguji solusi yang disediakan oleh @Chexpir, dan ini adalah cara yang lebih baik / lebih bersih (implementasi PostgreSQL) - Perhatikan juga urutannya direset ke 1 (bukannya mengambil jumlah baris)

public class ResetSequenceOperationDecorator extends DatabaseOperation {

    private DatabaseOperation decoree;

    public ResetSequenceOperationDecorator(DatabaseOperation decoree) {
         this.decoree = decoree;
     }

     @Override
     public void execute(IDatabaseConnection connection, IDataSet dataSet) throws DatabaseUnitException, SQLException {
         String[] tables = dataSet.getTableNames();
         Statement statement = connection.getConnection().createStatement();
         for (String table : tables) {
             try {
                 statement.execute("ALTER SEQUENCE " + table + "_id_seq RESTART WITH 1");
             }
             // Don't care because the sequence does not appear to exist (but catch it silently)
             catch(SQLException ex) {
             }
         }
         decoree.execute(connection, dataSet);
     }
}

Dan dalam DatabaseTestCase Anda:

public abstract class AbstractDBTestCase extends DataSourceBasedDBTestCase {

    @Override
    protected DatabaseOperation getTearDownOperation() throws Exception {
        return new ResetSequenceOperationDecorator(DatabaseOperation.DELETE_ALL);
    }
}

4
2018-01-29 13:34



Bisakah Anda periksa tautan di bawah jika tetap membantu Anda.

Bagaimana mengembalikan database kembali ke kondisi awal menggunakan dbUnit?


0
2017-12-16 10:22