坚持最高

通过引用开始使用Spring Data JPA学习Spring Data JPA课程:

1188金宝搏亚洲

1.概述

通常,在测试使用JNDI的应用程序时,我们可能希望使用模拟数据源,而不是真正的数据源。这是测试时的一种常见做法,目的是使我们的单元测试简单,并与任何外部上下文完全分离。

在本教程中,我们将展示如何使用Spring Framework和Simple-JNDI库测试模拟JNDI数据源。

在本教程中,我们将只关注单元测试。但是一定要看看我们关于如何创建使用JPA和JNDI数据源的Spring应用程序

2.快速JNDI回顾

简而言之,JNDI将逻辑名绑定到外部资源(如数据库连接)。其主要思想是,应用程序不需要知道所定义数据源的任何信息,只需要知道它的JNDI名称即可。金宝搏官网188be

简单地说,所有命名操作都是相对于上下文的,因此要使用JNDI访问命名服务,我们需要创建InitialContext第一个对象。顾名思义InitialContext封装为命名操作提供起点的初始(根)上下文。

简而言之,根上下文充当入口点。没有它,JNDI就不能绑定或查找我们的资源。

3.如何用Spring测试JNDI数据源

Spring通过JNDI提供了开箱即用的集成SimpleNamingContextBuilder。这个助手类提供了一种很好的方法来模拟JNDI环境以进行测试。

让我们看看如何使用SimpleNamingContextBuilder类来对JNDI数据源进行单元测试。

首先,我们需要建立一个绑定和检索数据源对象的初始命名上下文:

@BeforeEach public void init()抛出异常{SimpleNamingContextBuilder.emptyActivatedContextBuilder();这一点。initContext = new InitialContext();}

属性创建了根上下文emptyActivatedContextBuilder ()方法,因为它比构造函数提供了更大的灵活性,因为它创建一个新的构造函数或返回现有的构造函数。

现在我们有了一个上下文,让我们实现一个单元测试来看看如何存储和检索JDBC数据源使用JNDI对象:

@Test public void whenMockJndiDataSource_thenReturnJndiDataSource() throws Exception {this.initContext. initcontext;绑定(“java: comp / env / jdbc / datasource”,新DriverManagerDataSource (" jdbc: h2: mem: testdb "));DataSource ds = (DataSource) this.initContext.lookup("java:comp/env/jdbc/ DataSource ");assertNotNull (ds.getConnection ());}

正如我们所见,我们使用bind ()方法来映射JDBC数据源对象的名称java: comp / env / jdbc / datasource

然后我们使用查询()方法来检索数据源引用来自我们的JNDI上下文,使用我们以前绑定JDBC时使用的确切逻辑名数据源对象。

请注意,如果在上下文中没有找到指定的对象,JNDI将简单地抛出异常。

值得一提的是SimpleNamingContextBuilder类是自Spring 5.2以来已被弃用,取而代之的是其他解决方案,比如Simple-JNDI

4.使用简单JNDI模拟和测试JNDI数据源

Simple-JNDI允许我们这样做将属性文件中定义的对象绑定到模拟的JNDI环境。它极大地支持获取类型对象javax.sql.DataSource从Java EE容器外的JNDI。

让我们看看如何使用它首先,我们需要添加Simple-JNDI依赖我们pom.xml:

 com.github.h-thurow simple-jndi 0.23.0 

上可以找到simi - jndi库的最新版本Maven中央

接下来,我们将配置Simple-JNDI,其中包含设置JNDI上下文所需的所有细节。要做到这一点,我们需要创建一个jndi.properties需要放在类路径中的文件:

java.naming.factory.initial = org.osjava.sj。SimpleContextFactory org.osjava.sj.jndi。共享= true org.osjava.sj.delimiter =。jndi.syntax.separator=/ org.osjava.sj.space=java:/comp/env org.osjava.sj.root=src/main/resources/jndi

java.naming.factory.initial指定将用于创建初始上下文的上下文工厂类。

org.osjava.sj.jndi.shared = true意味着所有InitialContext对象将共享相同的内存。

如我们所见,我们使用了org.osjava.sj.space属性定义java: comp / env作为所有JNDI查找的起点。

使用两者背后的基本思想org.osjava.sj.delimiterjndi.syntax.separator属性是为了避免内附问题。

org.osjava.sj.root属性允许我们定义存储属性文件的路径。在我们的示例中,所有文件都将位于src / main /资源/ jndi文件夹中。

我们来定义ajavax.sql.DataSource对象在我们datasource.properties文件:

ds.type = javax.sql。数据源ds.driver=org.h2.Driver ds.url=jdbc:jdbc:h2:mem:testdb ds.user=sa ds.password=password

现在,让我们创建一个InitialContext对象用于单元测试:

@BeforeEach public void setup() throws Exception {this。initContext = new InitialContext();}

最后,我们将实现一个单元测试用例检索数据源对象中已经定义的datasource.properties文件:

@Test public void whenMockJndiDataSource_thenReturnJndiDataSource() throws Exception {String dsString = "org.h2.Driver::::jdbc:jdbc:h2:mem:testdb::::sa";Context envContext = (Context) this.initContext.lookup("java:/comp/env");DataSource ds = envContext.lookup(" DataSource /ds");assertequal (dsString ds.toString ());}

5.结论

在本教程中,我们解释了如何处理在J2EE容器外部测试JNDI的挑战。我们了解了如何使用Spring Framework和Simple-JNDI库测试模拟JNDI数据源。

与往常一样,代码是可用的在GitHub

坚持下
通过引用开始使用Spring Data JPA学习Spring Data JPA课程:1188金宝搏亚洲
对这篇文章的评论关闭!