在黄瓜中的步骤定义之间共享状态

Sharing state between step definitions in Cucumber

我有 4 个步骤定义 classes 和一组域对象 classes。 我的第一步定义 class 如下所示:

public class ClaimProcessSteps {
    Claim claim;

    public ClaimProcessSteps(Claim w){
        this.claim = w;
    }

    @Given("^a claim submitted with different enrolled phone's model$")
    public void aClaimSubmittedFromCLIENTSChannelWithDifferentEnrolledPhoneSModel() throws Throwable {
        claim = ObjMotherClaim.aClaimWithAssetIVH();
    }


}

我的索赔 class 看起来像这样:

public class Claim {
    private String claimType;
    private String clientName;                  
    private Customer caller;
    private List<Hold> holds;

    public Claim() {}

    public Claim(String claimType, String clientName, Customer caller) {
        this.claimType              =       claimType;
        this.clientName             =       clientName;
        this.caller                 =       caller;
    }

    public String getClaimType() {
        return claimType;
    }

我的第二步定义 class 看起来像:

public class CaseLookupSteps {
    Claim claim;

    public CaseLookupSteps(Claim w){
        this.claim = w;
    }

    @When("^I access case via (right|left) search$")
    public void iAccessCaseInCompassViaRightSearch(String searchVia) throws Throwable {
       System.out.println(claim.getClaimType());
    }

我已经在 POM.XML 中导入了 picocontainter 依赖项,但出现以下错误。

3 个可满足的构造函数对于 'class java.lang.String' 来说太多了。构造函数列表:[(Buffer), (Builder), ()]

None 我的步骤定义 classes 构造函数接收原语作为参数。有没有人知道为什么我仍然收到该错误?难道是我的业务对象构造函数在其构造函数中期望字符串?

在此先感谢您的帮助。

Picocontainer 不仅查看您的步骤定义 类 来解决依赖关系。它还会查看您的步骤定义所依赖的所有 类。

在这种情况下,它试图解决非默认 Claim 构造函数的依赖关系。

 public Claim(String claimType, String clientName, Customer caller) {
    ...
 }

根据这个issue,除了在所有依赖项中只保留默认构造函数之外,没有办法解决这个问题。

假设您的场景如下所示:

Given some sort of claim
When I lookup this claim
Then I see  this claim

目前您的测试缺少声明的设置步骤。

因此,与其直接在步骤之间共享声明对象,不如创建一个仅包含默认构造函数的 ClaimService class。您可以将此服务注入到您的步骤定义中。

注入服务后,您可以在Given some sort of claim的步骤定义中使用它来调用claimService.createSomeSortOfClaim()创建声明。可以在内存、模拟数据库、实际数据库或其他持久性介质中创建此声明。

然后在 When I lookup this claim 中使用 claimService.getClaim() 到 return 该声明,这样您就可以使用它的类型来搜索它。

这样做,您将避免尝试让 DI 容器弄清楚它应该如何创建被测声明的困难。