![](/img/trans.png)
[英]How to inject dataSource to jUnit for Integration Testing in SpringFramework 2
[英]How to call datasource in Junit
我有一个带有JSF页面的Maven WAR软件包。 通常我用
@Resource(name = "jdbc/Oracle")
private DataSource ds;
在Glassfish服务器上部署WAR软件包时调用数据库。 但是在使用Netbeans在笔记本电脑上构建软件包时,如果进行JUnit测试,则无法使用此数据源。 我该如何解决这个问题? 构建软件包后,我想立即用数据库表运行JUnit测试,但没有数据源。 有什么可能的解决方案?
您是否真的要针对数据库运行单元测试? 我个人会尽量避免这种情况,因为它通常将测试与数据库状态联系得太紧,并且经常阻止您实际测试“单元”以及您可能要处理的所有可能状态。 这也可能会使您的单元测试花费一些时间,这并不理想。
一种替代方法是使用例如EasyMock或Mockito创建模拟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.