使用Jersey测试框架的JUnit测试中的CDI

时间:2018-07-27 12:55:59

标签: dependency-injection jersey cdi inject jersey-test-framework

我们正在使用Jersey测试框架进行API测试。在测试模式下,我们使用h2数据库,即生产环境中的mysql。至此一切都很好。

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

我无法在测试中注入任何类,因此我正在使用标准构造函数来创建RepositoryA的新实例。为我工作。

现在出现问题:RepositoryA现在正在注入RepositoryB的实例。而且注入在测试范围内不起作用。

是否可以在这种环境下运行注射?

1 个答案:

答案 0 :(得分:2)

根据所使用的库的版本,在JUnit Test中运行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的实体类注入存储库的示例:

@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);
    }
 }

重要的部分是:

  • 放置在JUnit测试类上的@EnableWeld
  • @WeldSetup放在WeldInitiator字段上,以查找所有带注释的类。
  • 不要忘记测试类路径beans.xml中的META-INF,以便设置discovery-mode
  • @Slf4j是龙目岛注释,您不需要它(除非您已经在使用龙目岛)

在这里,VideoGameRepository实例也受益于注入,就像在经典的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服务器一起使用,以具有所有必需的依赖项。