2

DbUnit を使用して統合テストを実行する必要があります。データセット (テスト前後) を作成し、注釈を使用してそれらを比較しまし@DatabaseSetup@ExpectedDatabase。テスト中に、1 つの新しいデータベース行が作成されました (これは、@ExpectedDatabase注釈を使用して指定したテスト後のデータセットに表示されます)。問題は、行 ID が自動的に生成される (私は Hibernate を使用している) ため、行 ID が永続的に変化することです。したがって、私のテストは一度だけパスし、その後、テスト データセットの後に id を変更する必要がありますが、これは必要ではありません。この問題が DbUnit で解決できる場合は、この問題の解決策を教えてください。

4

3 に答える 3

2

ソリューション A:

割り当てられた ID 戦略を使用し、別のクエリを使用してビジネス ロジックの次の値を取得します。したがって、適切なデータベースのクリーンアップを使用して、永続性テストで常に既知の ID を割り当てることができます。これは、Oracle Sequence を使用している場合にのみ機能することに注意してください。

ソリューション B:

私が間違っていなければ、org.dbunit.Assertion の assertEqualsIngoreColumns() に似たメソッドがいくつかあります。したがって、気にしない場合は id アサーションを無視できます。通常、id の null でないチェックでそれを補います。@ExpectedDatabase にいくつかのオプションがあるかもしれませんが、わかりません。

ソリューション C:

ソリューション A ではパフォーマンスのオーバーヘッドが発生するのに対し、ソリューション B ではテスト カバレッジが少し犠牲になるため、より良いソリューションがあるかどうかを知りたいと思います。

ちなみに、使用しているdbunitのバージョン。これらの注釈は 2.4.9 以下では見たことがありませんが、使いやすそうです。

于 2013-07-17T13:55:30.840 に答える
0

この回避策は今まで私の肌を救っています:

代替機能を使用して AbstractDataSetLoader を実装しました。

public class ReplacerDataSetLoader extends AbstractDataSetLoader {
    private Map<String, Object> replacements = new ConcurrentHashMap<>();

    @Override
    protected IDataSet createDataSet(Resource resource) throws Exception {
        FlatXmlDataSetBuilder builder = new FlatXmlDataSetBuilder();
        builder.setColumnSensing(true);
        try (InputStream inputStream = resource.getInputStream()) {
            return createReplacementDataSet(builder.build(inputStream));
        }
    }

    /**
     * prepare some replacements
     * @param dataSet
     * @return
     */
    private ReplacementDataSet createReplacementDataSet(FlatXmlDataSet dataSet) {
        ReplacementDataSet replacementDataSet = new ReplacementDataSet(dataSet);

        //Configure the replacement dataset to replace '[null]' strings with null.
        replacementDataSet.addReplacementObject("[null]", null);
        replacementDataSet.addReplacementObject("[NULL]", null);
        replacementDataSet.addReplacementObject("[TODAY]", new Date());
        replacementDataSet.addReplacementObject("[NOW]", new Timestamp(System.currentTimeMillis()));

        for (java.util.Map.Entry<String, Object> entry : replacements.entrySet()) {
            replacementDataSet.addReplacementObject("["+entry.getKey()+"]", entry.getValue());
        }
        replacements.clear();

        return replacementDataSet;
    }

    public void replace(String replacement, Object value){
        replacements.put(replacement, value);
    }
}

これにより、必要なIDを追跡して睾丸で置き換えることができます

@DatabaseSetup(value="/test_data_user.xml")
@DbUnitConfiguration(dataSetLoaderBean = "replacerDataSetLoader")
public class ControllerITest extends WebAppConfigurationAware {

    //reference my test dbconnection so I can get last Id using regular query
    @Autowired
    DatabaseDataSourceConnection dbUnitDatabaseConnection;
    //reference my datasetloader so i can iteract with it
    @Autowired
    ColumnSensingFlatXMLDataSetLoader datasetLoader;


    private static Number lastid = Integer.valueOf(15156);
    @Before
    public void setup(){
        System.out.println("setting "+lastid);
        datasetLoader.replace("emp1", lastid.intValue()+1);
        datasetLoader.replace("emp2", lastid.intValue()+2);
    }

    @After
    public void tearDown() throws SQLException, DataSetException{
        ITable table = dbUnitDatabaseConnection.createQueryTable("ids", "select max(id) as id from company.entity_group");
        lastid = (Number)table.getValue(0, "id");
    }

    @Test
    @ExpectedDatabase(value="/expected_data.xml", assertionMode=DatabaseAssertionMode.NON_STRICT)
    public void test1() throws Exception{
        //run your  test logic
    }

    @Test
    @ExpectedDatabase(value="/expected_data.xml", assertionMode=DatabaseAssertionMode.NON_STRICT)
    public void test2() throws Exception{
        //run your  test logic
    }
}

そして、期待されるデータセットには、いくつかの置換 emp1 と emp2 が必要です

<?xml version='1.0' encoding='UTF-8'?>
<dataset>

    <company.entity_group ID="15155" corporate_name="comp1"/>
    <company.entity_group ID="15156" corporate_name="comp2"/>
    <company.entity_group ID="[emp1]" corporate_name="comp3"/>
    <company.entity_group ID="[emp2]" corporate_name="comp3"/>
    <company.ref_entity ID="1" entity_group_id="[emp1]"/>
    <company.ref_entity ID="2" entity_group_id="[emp2]"/>

</dataset>
于 2015-07-09T15:58:37.387 に答える
0

DatabaseAssertionMode.NO_STRICT を使用し、「expect.xml」から「id」列を削除します。DBUnit はこの列を無視します。

于 2018-05-08T07:08:02.680 に答える