在黄瓜中的步骤定义之间共享状态
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 容器弄清楚它应该如何创建被测声明的困难。
我有 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 容器弄清楚它应该如何创建被测声明的困难。