繁体   English   中英

如何在Junit中调用数据源

[英]How to call datasource in Junit

我有一个带有JSF页面的Maven WAR软件包。 通常我用

@Resource(name = "jdbc/Oracle")
    private DataSource ds;

在Glassfish服务器上部署WAR软件包时调用数据库。 但是在使用Netbeans在笔记本电脑上构建软件包时,如果进行JUnit测试,则无法使用此数据源。 我该如何解决这个问题? 构建软件包后,我想立即用数据库表运行JUnit测试,但没有数据源。 有什么可能的解决方案?

您是否真的要针对数据库运行单元测试? 我个人会尽量避免这种情况,因为它通常将测试与数据库状态联系得太紧,并且经常阻止您实际测试“单元”以及您可能要处理的所有可能状态。 这也可能会使您的单元测试花费一些时间,这并不理想。

一种替代方法是使用例如EasyMockMockito创建模拟DataSource 或者,如果您知道要在许多测试中为DataSources定义一些常见行为,则可以创建自己的DataSource接口的模拟实现。

如果您确实想使用数据库,则必须查看手动实例化您正在使用的DataSource任何实现(例如OracleDataSource ),然后在您的类中使用它。

无论哪种情况,您都可能不得不切换到使用构造函数或方法注入,以使其在测试实例上设置DataSource更加容易。 (否则,您将必须使用反射来设置私有变量。)

例如,您的班级可能看起来像这样:

public class DatabaseOperations {
    private DataSource dataSource;

    @Resource(name = "jdbc/Oracle")
    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    }
}

然后您的测试可能如下所示:

public class DatabaseOperationsTest {
    public void testSomeOperation() {
        DatabaseOperations databaseOperations = new DatabaseOperations();
        databaseOperations.setDataSource(new MockDataSource());
    }
}

如果确实需要使用注入的数据源运行测试,则可以考虑使用Arquillian,它将为您创建一个部署单元,将其与配置好的数据源一起部署到嵌入式或远程Glassfish容器中(如果需要)。 他们有针对此特定方案的指南

好处是您将拥有一个带有CDI的功能齐全的容器。 您可以控制获取软件包的内容,以便为CDI类提供测试存根。 您还可以控制部署配置(测试与生产配置)。 它是非侵入性的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM