gpt4 book ai didi

dependency-injection - 使用 Jersey 测试框架的 JUnit 测试中的 CDI

转载 作者:行者123 更新时间:2023-12-05 03:05:01 26 4
gpt4 key购买 nike

我们正在使用 Jersey 测试框架进行 API 测试。在测试模式下,我们使用 h2 数据库,在生产中使用 mysql。到目前为止一切都很好。

现在我想为我们的存储库编写测试,以检查数据是否正确写入数据库。

我无法在我的测试中注入(inject)任何类,所以我使用标准构造函数来创建 RepositoryA 的新实例。适合我。

现在的问题是:RepositoryA 现在正在注入(inject) RepositoryB 的一个实例。并且注入(inject)不适用于测试范围。

是否可以在这种环境中运行注入(inject)?

最佳答案

根据您使用的库的版本,在 JUnit 测试中运行 CDI 是不同的。

首先你需要添加这个依赖,选择正确的版本:

<dependency>
<groupId>org.jboss.weld</groupId>
<artifactId>weld-junit5</artifactId> // or weld-junit4
<version>1.3.0.Final</version>
<scope>test</scope>
</dependency>

然后您可以在 JUnit 测试中启用 Weld。这是一个为名为 VideoGame 的实体类注入(inject)存储库的示例:

@Slf4j
@EnableWeld
class VideoGameRepositoryTest
{
@WeldSetup
private WeldInitiator weld = WeldInitiator.performDefaultDiscovery();

@Inject
private VideoGameRepository repo;

@Test
void test()
{
VideoGame videoGame = VideoGameFactory.newInstance();
videoGame.setName("XENON");
repo.save(videoGame);
// testing if the ID field had been generated by the JPA Provider.
Assert.assertNotNull(videoGame.getVersion());
Assert.assertTrue(videoGame.getVersion() > 0);
log.info("Video Game : {}", videoGame);
}
}

重要的部分是:

  • @EnableWeld放在 JUnit 测试类上。
  • @WeldSetup放在 WeldInitiator 上字段,以查找所有带注释的类。
  • 别忘了beans.xmlMETA-INF你的测试类路径为了设置 discovery-mode .
  • @Slf4j是一个lombok注解,你不需要它(除非你已经在使用Lombok)

这里是 VideoGameRepository实例也有利于注入(inject),就像在经典的 CDI 项目中一样。

这是 VideoGameFactory 的代码它获得了标有 @Dependent 的实体类的全新实例范围。该工厂以编程方式调用 CDI 当前上下文。

public class VideoGameFactory
{
public static VideoGame newInstance()
{
// ask CDI for the instance, injecting required dependencies.
return CDI.current().select(VideoGame.class).get();
}
}

或者,您可以查看 Arquillian,它可以带有完整的 Java EE 服务器,以便拥有所有需要的依赖项。

关于dependency-injection - 使用 Jersey 测试框架的 JUnit 测试中的 CDI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51558446/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com