1. 개요

일반적으로 JNDI를 사용하는 애플리케이션을 테스트할 때 실제 데이터 소스 대신 모의 데이터 소스를 사용하고 싶을 수 있습니다. 이것은 단위 테스트를 간단하고 외부 컨텍스트와 완전히 분리하기 위해 테스트할 때 일반적인 관행입니다.

이 예제에서는 Spring Framework와 Simple-JNDI 라이브러리를 사용하여 모의 JNDI 데이터 소스를 테스트하는 방법을 보여줄입니다.

이 사용방법(예제)에서는 단위 테스트에만 집중할 것입니다. 그러나 JNDI 데이터 소스와 함께 JPA를 사용하여 Spring 애플리케이션 을 만드는 방법에 대한 기사를 확인하십시오 .

2. 빠른 JNDI 요약

간단히 말해서 JNDI는 논리적 이름을 데이터베이스 연결과 같은 외부 리소스에 바인딩합니다 . 주요 아이디어는 애플리케이션이 JNDI 이름을 제외하고 정의된 데이터 소스에 대해 아무것도 알 필요가 없다는 것입니다.

간단히 말해서 모든 네이밍 작업은 컨텍스트와 관련이 있으므로 JNDI를 사용하여 네이밍 서비스에 액세스하려면 먼저 InitialContext 객체 를 생성해야 합니다 . 이름에서 알 수 있듯이 InitialContext 클래스 는 명명 작업의 시작점을 제공하는 초기(루트) 컨텍스트를 캡슐화합니다.

간단히 말해서 루트 컨텍스트는 진입점 역할을 합니다. 이것이 없으면 JNDI는 리소스를 바인딩하거나 조회할 수 없습니다.

3. Spring으로 JNDI 데이터 소스를 테스트하는 방법

Spring은 SimpleNamingContextBuilder를 통해 JNDI와 즉시 통합을 제공합니다 . 이 도우미 클래스는 테스트 목적으로 JNDI 환경을 조롱하는 좋은 방법을 제공합니다.

따라서 SimpleNamingContextBuilder 클래스를 사용하여 JNDI 데이터 소스를 단위 테스트하는 방법을 살펴보겠습니다 .

먼저 데이터 소스 객체를 바인딩하고 검색하기 위한 초기 명명 컨텍스트 를 구축해야 합니다 .

@BeforeEach
public void init() throws Exception {
    SimpleNamingContextBuilder.emptyActivatedContextBuilder();
    this.initContext = new InitialContext();
}

우리는 emptyActivatedContextBuilder() 메서드를 사용하여 루트 컨텍스트를 만들었습니다. 새로운 빌더를 생성하거나 기존 빌더를 반환할 때 생성자에 대해 더 많은 유연성을 제공하기 때문입니다.

이제 컨텍스트가 있으므로 JNDI를 사용하여 JDBC DataSource 객체 를 저장하고 검색하는 방법을 보기 위해 단위 테스트를 구현해 보겠습니다 .

@Test
public void whenMockJndiDataSource_thenReturnJndiDataSource() throws Exception {
    this.initContext.bind("java:comp/env/jdbc/datasource", 
      new DriverManagerDataSource("jdbc:h2:mem:testdb"));
    DataSource ds = (DataSource) this.initContext.lookup("java:comp/env/jdbc/datasource");

    assertNotNull(ds.getConnection());
}

우리가 볼 수 있듯이 , 우리가 사용하는  바인드 () 우리의 JDBC 매핑하는 방법을 데이터 소스의 이름에 객체를 은 java : comp / env / jdbc / 데이터 소스 .

그런 다음 이전에 JDBC DataSource 개체 를 바인딩하는 데 사용한 정확한 논리적 이름을 사용하여 JNDI 컨텍스트에서 DataSource 참조 를 검색 하기 위해 lookup() 메서드를 사용 합니다.

JNDI는 컨텍스트에서 지정된 객체를 찾을 수 없는 경우 단순히 예외를 throw합니다.

것을 언급 그것의 가치  SimpleNamingContextBuilder의 클래스입니다 같은 다른 솔루션에 찬성 스프링 5.2부터 사용되지 않습니다 간단한-JNDI .

4. Simple-JNDI를 사용하여 JNDI 데이터 소스 모의 및 테스트

Simple-JNDI를 사용하면 속성 파일에 정의된 객체를 조롱된 JNDI 환경바인딩 할 수 있습니다 . Java EE 컨테이너 외부의 JNDI에서 javax.sql.DataSource 유형의 객체를 얻는 데 큰 지원이 제공됩니다 .

그럼 어떻게 사용하는지 봅시다 . 먼저 pom.xml에 Simple-JNDI 의존성을 추가해야 합니다 .

<dependency>
    <groupId>com.github.h-thurow</groupId>
    <artifactId>simple-jndi</artifactId>
    <version>0.23.0</version>
</dependency>

Simple-JNDI 라이브러리의 최신 버전은 Maven Central 에서 찾을 수 있습니다 .

다음으로 JNDI 컨텍스트를 설정하는 데 필요한 모든 세부 정보로 Simple-JNDI를 구성합니다. 그렇게 하려면 클래스 경로에 배치해야 하는 jndi.properties 파일 을 만들어야 합니다 .

java.naming.factory.initial=org.osjava.sj.SimpleContextFactory
org.osjava.sj.jndi.shared=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 속성을 사용하여 모든 JNDI 조회의 시작점으로 java:/comp/env 를 정의했습니다 .

org.osjava.sj.delimiterjndi.syntax.separator 속성 을 모두 사용하는 기본 아이디어 ENC 문제 를 방지하는 것 입니다.

org.osjava.sj.root 속성을 사용하면 속성 파일이 저장되는 경로를 정의할 수 있습니다 . 우리의 경우 모든 파일은 src/main/resources/jndi 폴더에 있습니다.

따라서 datasource.properties 파일 내에 javax.sql.DataSource 객체를 정의해 보겠습니다 .

ds.type=javax.sql.DataSource
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 파일 에 이미 정의된 DataSource 객체 를 검색 하는 단위 테스트 케이스 구현 합니다 .

@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 = (DataSource) envContext.lookup("datasource/ds");

    assertEquals(dsString, ds.toString());
}

5. 결론

이 사용방법(예제)에서는 J2EE 컨테이너 외부에서 JNDI를 테스트하는 문제를 해결하는 방법을 설명했습니다. Spring Framework 및 Simple-JNDI 라이브러리를 사용하여 모의 JNDI 데이터 소스를 테스트하는 방법을 살펴보았습니다.

항상 그렇듯이 코드는 GitHub 에서 사용할 수 있습니다 .

Persistence footer banner