微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

单元测试中ORACLE数据库的初始化

如何解决单元测试中ORACLE数据库的初始化

我一直在尝试为我的应用程序编写一些单元测试。我在 docker 容器中使用 oracle 数据库

我使用 ScriptUtils.executesqlScript()sql 文件初始化数据库。如果我使用的是 MysqL 数据库,但我的 Oracle 模式中有 PL/sql,并且在执行模式时出现异常(我 100% 确定模式有效),则这项工作有效。

END; nested exception is java.sql.sqlSyntaxErrorException: ORA-00900: invalid sql statement

我猜 ScriptUtils.executesqlScript() 不支持 PL/sql

由于我不想在 docker-compose.yml 中进行卷绑定,因此在启动 docker 容器时无法初始化表。

  1. 是否有更好的方法来初始化适用于任何数据库技术的 JUnit 测试表?

  2. 如您所见,我在测试之前生成表并在测试之后删除它们,但我还有其他测试将使用这些表,因此我想为所有与 oracle 相关的测试创建一次表。有没有办法做到这一点?

@SpringBoottest
public class JdbcUserDaoImpltest {

    private static JdbcUserDaoImpl userDao;

    private User user;

    @BeforeClass
    public static void init() throws sqlException {
        userDao = new MysqljdbcUserDaoImpl(dataSource());
        ScriptUtils.executesqlScript(Objects.requireNonNull(userDao.getDataSource()).getConnection(),new ClassPathResource("pre.schema.sql"));
        ScriptUtils.executesqlScript(userDao.getDataSource().getConnection(),new ClassPathResource("schema.sql"));
    }

    ... TEST CASES ...

    public static DataSource dataSource() {
        DataSourceBuilder<?> dataSourceBuilder = DataSourceBuilder.create();
        dataSourceBuilder.driverClassName("oracle.jdbc.OracleDriver");
        dataSourceBuilder.url("jdbc:oracle:thin:@127.0.0.1:1507:XE");
        dataSourceBuilder.username("system");
        dataSourceBuilder.password("oracle");
        return dataSourceBuilder.build();
    }

    @AfterClass
    public static void destroy() throws sqlException {
        ScriptUtils.executesqlScript(Objects.requireNonNull(userDao.getDataSource()).getConnection(),new ClassPathResource("drop.sql"));
    }
}

编辑

不可部署的 sql 示例

CREATE TRIGGER item_trigger
    BEFORE INSERT
    ON items
    FOR EACH ROW
BEGIN

    IF :NEW.item_date IS NULL
    THEN
        SELECT CURRENT_TIMESTAMP INTO :NEW.item_date FROM DUAL;
    END IF;

    IF :NEW.item_uid IS NULL
    THEN
        SELECT SYS_GUID() INTO :NEW.item_uid FROM DUAL;
    END IF;

END;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。