首页 > 解决方案 > 使用 dbunit 时 DAO 保存方法的问题

问题描述

我有一个测试将组添加到数据库的类:

class GroupDAOTest extends TestCase {

    private IDatabaseTester databaseTester;
    private GroupDao groupDao;

    @BeforeEach
    protected void setUp() throws Exception
    {
        databaseTester = new JdbcDatabaseTester("org.postgresql.Driver",
                "jdbc:postgresql://localhost:5432/database_school", "principal", "school");
        String file = getClass().getClassLoader().getResource("preparedDataset.xml").getFile();
        IDataSet dataSet = new FlatXmlDataSetBuilder().build(new File(file));
        databaseTester.setDataSet(dataSet);
        databaseTester.setSetUpOperation(DatabaseOperation.CLEAN_INSERT);
        databaseTester.onSetup();
        groupDao = new GroupDao();
    }

    @Test
    void add() throws Exception {
        groupDao.save(new Group("NEW_GROUP"));

        IDataSet databaseDataSet = databaseTester.getConnection().createDataSet();
        ITable actualTable = databaseDataSet.getTable("groups");

        String file = getClass().getClassLoader().getResource("GroupDao/add.xml").getFile();
        IDataSet expectedDataSet = new FlatXmlDataSetBuilder().build(new File(file));
        ITable expectedTable = expectedDataSet.getTable("groups");

        Assertion.assertEquals(expectedTable, actualTable);
    }

这里是方法“groupDao.save(new Group(”NEW_GROUP“));” 必须添加一个 id = 4、name = "NEW_GROUP" 的组。一旦测试通过,但是当我一次又一次地运行它时,该组被添加了,但由于某种原因,id 增加了一个。对于某些发布,它已经是这样的:

[![enter image description here][1]][1]

检查 groupDao.save () - 一切都很好,尝试更改 databaseTester.setSetUpOperation (DatabaseOperation ***),但没有帮助。你能告诉我问题出在哪里,也许我只是没有清除一些东西?

以防万一我的 dao 方法:

@Override
    public void save(Group group) {
        try (Connection connection = connectionProvider.getConnection();
             PreparedStatement statement = connection.prepareStatement(SAVE_NEW_RECORD)) {
            statement.setString(1, group.getName());
            statement.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

和表模式:

CREATE TABLE 组( group_id 序列主键,group_name VARCHAR(10) UNIQUE NOT NULL );

标签: javapostgresqljunitdbunit

解决方案


一旦测试通过,但是当我一次又一次地运行它时,该组被添加了,但由于某种原因,id 增加了一个。

问题不在于您的代码或配置。PostgreSQL 串行字段类型是自动递增的。每次将行保存到表中时,它将字段值加 1。

使用 dbUnit ValueComparer 断言来与大于或等于进行比较,而不是您当前使用的断言方法仅在相等时进行比较。 http://dbunit.sourceforge.net/datacomparisons/valuecomparer.html


推荐阅读