2016-04-28 54 views
3

我在使用JUnit和Cucumber測試我的代碼的maven項目中有一個JEE應用程序。應用程序在測試範圍內使用CDI進行焊接。黃瓜CDI注入不能在src/main/java中使用beans

我已經創建了一個簡單的特徵文件src/test/resources/specification/first.feature

Scenario: Identified user 
    Given I am user A 

然後創建相應的黃瓜步驟:

public class FirstSteps { 

@Inject 
UserService userService; 

@Given("^I am user A$") 
public void i_am_user_A() throws Throwable { 
    User user = User.new().withName("user A").create(); 
    assertThat(userService.getActualUser()).isEqualTo(user); 
} 

} 

用戶服務是一個簡單的實現的接口:

public interface UserService { 
    User getActualUser(); 
} 

public class FakeUserService implements UserService { 

    @Override 
    public User getActualUser() { 
     return User.new().withName("user A").create(); 
    } 

} 

中有空的beans.xml文件和src/test/resources/META-INF

該步驟位於src/test/resources,服務接口及其實現在src/main/java

這裏是基於JUnit測試吧:

@RunWith(Cucumber.class) 
@CucumberOptions(
    features = {"classpath:specifikation"}, 
    glue = {"mypackage"}) 
public final class CucumberTests { 
} 

步驟由黃瓜發現和得到執行。但是CDI不起作用:

Exception in thread "main" org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type UserService with qualifiers @Default at injection point [BackedAnnotatedField] @Inject mypackage.FirstSteps.userService

我發現this issue on github for cucumber。但該解決方案對我無效。我已在src/main/resources/META-INFsrc/test/resources/META-INF中有兩個空的beans.xml文件。

似乎焊縫容器只爲src/test創建了一個上下文,並且src/main中的所有內容都不屬於它。當我將服務接口和實現移動到src/test/java時,它可以工作...

有沒有一種方法可以從src/test引用src/main中的bean?

編輯:(?錯字)服務接口

回答

3

假設你的腳步位於src/test/java和服務(接口)位於src/main/java而不是在src/(test|main)/resources,您的設置應該工作的校正位置。

也許檢查以下內容:

  1. 確保您src/main/javasrc/test/java文件夾是在同一類路徑。
  2. 假設您正在使用符合CDI> 1.1的Weld當前版本,請確保這兩個文件夾都是explicit bean archives
  3. 確保您的beans.xml文件字面上爲空或具有bean-discovery-mode set to all

如果這也行不通,請嘗試註釋您的FakeUserService

+0

謝謝。這是bean的發現:一個beans.xml放在META-INF中,另一個放在META_INF中。有錯誤事情發生的小錯字...;) –