You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于WebSphere Liberty与Maven的CI/CD:无Mock的JUnit测试问题

解决方案:无需Mock的EJB与数据库JUnit测试(WebSphere Liberty + Jenkins CI/CD)

我之前帮不少开发者解决过类似的问题,你这种场景其实核心是要在Jenkins构建阶段启动一个嵌入式的WebSphere Liberty实例,让你的JUnit测试能直接和这个轻量容器里的EJB、数据源交互,完全不用Mock。下面是具体的实现步骤:

1. 用WebSphere Liberty Maven插件启动嵌入式服务器

首先在你的pom.xml中添加Liberty Maven插件,它能帮你在Maven构建生命周期中自动启动/停止嵌入式Liberty服务器:

<build>
  <plugins>
    <plugin>
      <groupId>io.openliberty.tools</groupId>
      <artifactId>liberty-maven-plugin</artifactId>
      <version>3.8.1</version> <!-- 选择兼容19.0.0.8的最新版本 -->
      <configuration>
        <serverName>testServer</serverName>
        <serverXml>${project.basedir}/src/test/resources/test-server.xml</serverXml>
        <bootstrapProperties>
          <default.http.port>9081</default.http.port>
          <default.https.port>9444</default.https.port>
          <orb.listener.port>2809</orb.listener.port> <!-- EJB远程访问端口 -->
        </bootstrapProperties>
      </configuration>
      <executions>
        <!-- 测试前启动服务器 -->
        <execution>
          <id>start-server</id>
          <phase>pre-integration-test</phase>
          <goals>
            <goal>start-server</goal>
          </goals>
        </execution>
        <!-- 测试后停止服务器 -->
        <execution>
          <id>stop-server</id>
          <phase>post-integration-test</phase>
          <goals>
            <goal>stop-server</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

2. 配置测试用数据源

创建src/test/resources/test-server.xml,专门用于测试环境的服务器配置。这里推荐两种方案:

方案A:嵌入式H2数据库(轻量无依赖)

适合快速验证,无需额外安装数据库:

<server description="Test Server">
  <featureManager>
    <feature>ejbLite-3.2</feature> <!-- 匹配你的EJB版本需求 -->
    <feature>jdbc-4.2</feature>
    <feature>jndi-1.0</feature>
  </featureManager>

  <!-- 嵌入式H2数据源 -->
  <dataSource id="YourDataSource" jndiName="jdbc/YourDataSource">
    <jdbcDriver libraryRef="H2Lib"/>
    <properties.h2 databaseName="mem:testdb;DB_CLOSE_DELAY=-1" user="sa" password=""/>
  </dataSource>

  <library id="H2Lib">
    <file name="${maven.dependency.com.h2database.h2.path}"/>
  </library>
</server>

别忘了在pom.xml中添加H2依赖:

<dependencies>
  <dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>2.2.224</version>
    <scope>test</scope>
  </dependency>
</dependencies>

方案B:容器化数据库(贴近生产环境)

如果需要和生产数据库(如MySQL/DB2)保持一致,可以用Testcontainers自动管理数据库容器,测试时自动启动、结束后自动销毁。

3. 编写JUnit测试访问EJB

在测试类中通过InitialContext查找EJB接口,配置正确的JNDI属性即可直接调用EJB方法并验证数据库操作:

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import static org.junit.Assert.*;

public class YourEjbTest {
    private static YourEjbInterface ejb;

    @BeforeClass
    public static void setUp() throws NamingException {
        // 配置JNDI环境,指向嵌入式Liberty服务器
        System.setProperty("java.naming.factory.initial", "com.ibm.websphere.naming.WsnInitialContextFactory");
        System.setProperty("java.naming.provider.url", "corbaname:iiop:localhost:2809");

        // 查找EJB(JNDI名称需和你的EJB部署配置一致)
        InitialContext ctx = new InitialContext();
        ejb = (YourEjbInterface) ctx.lookup("java:global/your-app-name/YourEjbImpl!com.yourpackage.YourEjbInterface");
    }

    @Test
    public void testDatabaseOperation() {
        // 调用EJB方法,该方法会直接操作测试数据库
        String result = ejb.saveTestData("sample-content");
        
        // 验证结果(可直接查询数据库或通过EJB返回值验证)
        assertNotNull(result);
        assertEquals("success", result);
    }

    @AfterClass
    public static void tearDown() throws NamingException {
        // 清理资源(如果是有状态EJB,记得调用remove方法销毁)
        if (ejb != null) {
            // ((StatefulSessionBean) ejb).remove();
        }
    }
}

4. Jenkins构建配置

在Jenkins中只需要执行标准的Maven命令,插件会自动处理服务器的启动和停止:

  • Freestyle项目:在"构建"步骤添加"Invoke top-level Maven targets",目标填写clean verify
  • Pipeline项目:添加如下阶段:
pipeline {
    agent any
    stages {
        stage('Build & Test') {
            steps {
                sh 'mvn clean verify'
            }
        }
    }
}

5. 额外优化建议

  • 将测试环境配置放在Maven Profile中,方便区分开发、测试、生产环境
  • 启用Liberty的测试模式,减少服务器启动时间,提升构建效率
  • 在Jenkins中配置Maven依赖缓存,避免每次构建重复下载依赖包和Liberty服务器镜像

内容的提问来源于stack exchange,提问作者user3410249

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:12:57