正在使用Maven开发应用程序,它具有EJB层。我在WebSphere Liberty服务器中配置了数据源。所有事务都可以由服务器处理。我正在使用Jenkins来构建应用程序。我想创建CI / CD实现。为此,我尝试在应用程序中添加Junit测试。但是在进行Jenkins构建时无法连接数据库。因为在构建时没有通信黑白服务器和詹金斯。我如何创建无需数据库即可处理数据库连接和EJB的Junit。?
您可以在此处使用的一个可能的解决方案是称为MicroShed Testing的集成测试库。它是为与JavaEE / MicroProfile应用服务器(如Liberty)进行集成测试而创建的,可用于运行外部资源(如数据库)的应用程序的测试。
MicroShed Testing非常适合在Docker容器内运行Liberty应用程序的情况。如果您在Docker中运行,则可以轻松编写一个如下所示的集成测试:
@MicroShedTest
@SharedContainerConfig(AppContainerConfig.class)
public class DatabaseTest {
@Inject
public static MyJAXRSEndpoint personSvc;
@Test
public void testGetPerson() {
Long bobId = personSvc.createPerson("Bob", 24);
Person bob = personSvc.getPerson(bobId);
assertEquals("Bob", bob.name);
assertEquals(24, bob.age);
}
}
为了使此工作正常,您可以在@SharedContainerConfig
注释所引用的类中定义应用程序拓扑,如下所示:
public class AppContainerConfig implements SharedContainerConfiguration {
@Container
public static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>()
.withNetworkAliases("testpostgres")
.withDatabaseName("testdb");
@Container
public static MicroProfileApplication app = new MicroProfileApplication()
.withEnv("POSTGRES_HOSTNAME", "testpostgres")
.withEnv("POSTGRES_PORT", "5432")
.withAppContextRoot("/myservice");
@Override
public void startContainers() {
postgres.start();
app.start();
}
}
上面的代码将执行以下步骤:1)使用仓库中的Dockerfile将应用程序构建到Docker容器中2)启动应用程序的docker容器和postgresql数据库(或您可能需要的任何其他数据库容器)3)等待容器准备就绪,然后运行测试以在正在运行的容器上调用HTTP请求]
我发现这种方法很好,因为它可以在安装了Docker的任何地方以相同的方式工作-无论是在本地机器上还是在CI / CD管道中。
有关MicroShed Testing的更多信息,建议您在以下位置查看网站:https://microshed.org/microshed-testing/尤其是示例,其中包括Liberty + Database示例:https://microshed.org/microshed-testing/features/99_Examples.html
免责声明:我从事Liberty和MicroShed测试的工作