java - 如何将依赖项注入(inject) JerseyTest?

标签 java dependency-injection cdi jersey-2.0 jersey-test-framework

我想使用 CDI 将 MyService 直接注入(inject)我的 JerseyTest。是否可以? MyService 已成功注入(inject)到 MyResource 中,但当我尝试从 MyJerseyTest 访问它时出现 NullPointerException。

public class MyResourceTest extends JerseyTest {

  @Inject
  MyService myService;

  private Weld weld;

  @Override
  protected Application configure() {
    Properties props = System.getProperties();
    props.setProperty("org.jboss.weld.se.archive.isolation", "false");

    weld = new Weld();
    weld.initialize();

    return new ResourceConfig(MyResource.class);
  }

  @Override
  public void tearDown() throws Exception {
    weld.shutdown();
    super.tearDown();
  }

  @Test
  public void testGetPersonsCount() {
    myService.doSomething();  // NullPointerException here

    // ...

  }

}

最佳答案

我认为您需要提供一个 org.junit.runner.Runner 实例,您将在其中进行焊接初始化。该运行器还应负责提供 Test 类的实例,并注入(inject)必要的依赖项。示例如下所示

public class WeldJUnit4Runner extends BlockJUnit4ClassRunner {  

private final Class<?> clazz;  
private final Weld weld;  
private final WeldContainer container;  

public WeldJUnit4Runner(final Class<Object> clazz) throws InitializationError {  
    super(clazz);  
    this.clazz = clazz;  
    // Do weld initialization here. You should remove your weld initialization code from your Test class.
    this.weld = new Weld();  
    this.container = weld.initialize();  
}  

@Override  
protected Object createTest() throws Exception {  
    return container.instance().select(clazz).get();    
}  
} 

并且您的测试类应该使用 @RunWith(WeldJUnit4Runner.class) 进行注释,如下所示。

@RunWith(WeldJUnit4Runner.class)
public class MyResourceTest extends JerseyTest {

@Inject
MyService myService;

  // Test Methods follow
}

关于java - 如何将依赖项注入(inject) JerseyTest?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42815132/

相关文章:

java - 将 HTML 输入类型 DATE 转换为 MYSQL DATE

java - 嵌入的 Hibernate 实体的分配值返回 null

java - Java中不同引用类型的使用

configuration - 使用 ".properties"文件的依赖注入(inject)

java - 处理3.2中设置图像colorkey

c# - 注入(inject) InSingletonScope 的对象是否也可以注入(inject)到其他地方的多重绑定(bind)中?

dependency-injection - 使用 @Resource 通过 Java EE 6 和 Glassfish 3.1 注入(inject)资源时遇到问题

java - 使用 cdi 注入(inject)缓存实例

java - 如何在CDI事件中使用参数?

java - 无法在 Glassfish 4.0 中执行 CDI