Java 参数化测试因mvn测试而失败

Java 参数化测试因mvn测试而失败,java,maven,junit,lombok,parameterized,Java,Maven,Junit,Lombok,Parameterized,我一直在为一个简单的参数化java测试苦苦挣扎,却找不到合适的解决方案:-S 也许你能给我一个暗示,我错过了什么 我一直在测试以下场景 与 intellij->无错误,所有测试均通过 mvn clean-Dtest:KnockoutTests测试->无错误,所有测试均通过 mvn清洁测试(本地和jenkins上)->ArrayIndexOutOfBoundsException 当我在类RoundDefinition中复制精确生成的hashCode方法时,它工作得很好。但是我不想明确地用生成

我一直在为一个简单的参数化java测试苦苦挣扎,却找不到合适的解决方案:-S

也许你能给我一个暗示,我错过了什么

我一直在测试以下场景 与

  • intellij->无错误,所有测试均通过
  • mvn clean-Dtest:KnockoutTests测试
    ->无错误,所有测试均通过
  • mvn清洁测试
    (本地和jenkins上)->ArrayIndexOutOfBoundsException

当我在类
RoundDefinition
中复制精确生成的
hashCode
方法时,它工作得很好。但是我不想明确地用生成的方法覆盖
hashCode
方法。。。(这显然不是解决方案)

模型

@实体
@资料
@表(name=“tbl_rounddefinition”)
@JsonIgnoreProperties(值={“hibernateLazyInitializer”,“handler”,},ignoreUnknown=true)
@ToString(排除={“锦标赛”})
@EqualsAndHashCode(排除={“锦标赛”})
公共类RoundDefinition实现可序列化{
@身份证
@生成值(策略=标识)
@列(name=“rounddefinition\u id”)
私人长id;
@manytone(fetch=FetchType.LAZY)
@JoinColumn(name=“rounddefinition\u linktournamentid”)
@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class,property=“id”)
@JsonIdentityReference(alwaysAsId=true)
私人锦标赛;
@列(name=“rounddefinition\u round”)
私有整数舍入;
@列(name=“rounddefinition\u numberOfRoundresults”)
私有整数numberOfRoundresults;
}
@数据
@ToString(排除={[…]})
@EqualsAndHashCode(排除={[…],roundDefinitions})
@实体
@表(name=“tbl_锦标赛”)
@JsonIgnoreProperties(值={“hibernateLazyInitializer”,“handler”},ignoreUnknown=true)
公共类实现了可序列化{
[...]
@OneToMany(fetch=FetchType.LAZY,mappedBy=“锦标赛”,cascade=CascadeType.ALL,orphan=true)
@JsonSerialize(使用=CollectionSerializer.class)
@JsonDeserialize(使用=CollectionDeserializer.class)
@订购人(“轮ASC”)
private Set roundDefinitions=new HashSet();
[...]
}
试验

@RunWith(Parameterized.class)
@Slf4j
公开类淘汰测试{
@注射模拟
私人淘汰测试;
@嘲弄
私有匹配存储库匹配存储库;
私有整数tournamentSize;
私有整数expectedMatchSize;
私有整数应为MaxRound;
私人名单定义;
公开淘汰赛测试(Integer tournamentSize、Integer expectedMatchSize、Integer expectedMaxRound、,
列表(定义)
{
this.tournamentSize=tournamentSize;
this.expectedMatchSize=expectedMatchSize;
this.expectedMaxRound=expectedMaxRound;
this.roundDefinitions=roundDefinitions;
}
@以前
公共作废设置(){
initMocks(this);
}
@试验
公共void testGenerate(){
锦标赛=新锦标赛();
赛程。赛程(1);
系统.out.println(“##############”+roundDefinitions.toString()+”;

setRoundDefinitions(新的HashSet(roundDefinitions));//所以我终于有了一点可以继续下去了

当我试了几次后,我注意到我的测试不知怎么又起作用了

当我使用概要文件运行测试时,它们失败了,而在没有概要文件的情况下运行时,它们工作了。 经过一些挖掘和重构,我得到了项目的pom文件

插件“maven-suefire-plugin”像这样添加了两次


[...]
单元测试
[...]
org.apache.maven.plugins
maven surefire插件
${argLine}-Dfile.encodeing=utf-8-Duser.timezone=UTC
[...]

[...]
org.apache.maven.plugins
maven surefire插件
-数据文件编码=utf-8-Duser.timezone=UTC
[...]
但是pom文件中根本没有设置属性
${argLine}
。 因此,我引入了一个新属性
,并将这些参数放在那里……瞧,它起了作用。。。。
我不知道为什么hashcode方法中会抛出异常,但也许这对其他人也有帮助:-)

你能看到Lombok为
hashcode
生成的代码吗?你能理解为什么它会抛出ArrayOutOfBoundException吗?编辑了我的问题我认为这里还发生了其他事情,就是这样的描述吗没有意义。我建议做一个测试,找出问题出在谜题的哪个特定部分。也许可以先去掉参数化测试的复杂性——只编写一个单元测试。是的,这将是我的下一次尝试。仅供参考,我刚刚切换了
新哈希集(roundDefinitions)
到显式循环。我认为我的实体类Single测试有问题,没有任何特殊的运行程序,在使用
mvn clean test
运行时失败,但在运行
mvn clean-Dtest:KnockoutTests test
或使用IDE时成功完成。所以完全相同的行为…wtf
############# [RoundDefinition(id=1, tournament=null, round=1, numberOfRoundresults=1)] #############

############# [RoundDefinition(id=1, tournament=null, round=1, numberOfRoundresults=1), RoundDefinition(id=2, tournament=null, round=3, numberOfRoundresults=3), RoundDefinition(id=3, tournament=null, round=4, numberOfRoundresults=5)] #############
############# [RoundDefinition(id=1, tournament=null, round=1, numberOfRoundresults=1)] #############
############# [RoundDefinition(id=1, tournament=null, round=1, numberOfRoundresults=1)] #############
############# [RoundDefinition(id=1, tournament=null, round=1, numberOfRoundresults=1)] #############
############# [RoundDefinition(id=1, tournament=null, round=1, numberOfRoundresults=1)] #############
############# [RoundDefinition(id=1, tournament=null, round=1, numberOfRoundresults=1), RoundDefinition(id=2, tournament=null, round=3, numberOfRoundresults=3), RoundDefinition(id=3, tournament=null, round=4, numberOfRoundresults=5)] #############
Tests run: 8, Failures: 0, Errors: 8, Skipped: 0, Time elapsed: 0.015 sec <<< FAILURE! - in pkg.service.tournament.handler.generator.KnockoutTests
testGenerate[0: Test with tournamentSize=1, expectedMatchSize: 1, expectedMaxRound: 1](pkg.service.tournament.handler.generator.KnockoutTests)  Time elapsed: 0.008 sec  <<< ERROR!
java.lang.ArrayIndexOutOfBoundsException: 35
    at pkg.model.entities.RoundDefinition.hashCode(RoundDefinition.java:26)
    at java.util.HashMap.hash(HashMap.java:339)
    at java.util.HashMap.put(HashMap.java:612)
    at java.util.HashSet.add(HashSet.java:220)
    at java.util.AbstractCollection.addAll(AbstractCollection.java:344)
    at java.util.HashSet.<init>(HashSet.java:120)
    at pkg.service.tournament.handler.generator.KnockoutTests.testGenerate(KnockoutTests.java:67)

testGenerate[1: Test with tournamentSize=2, expectedMatchSize: 1, expectedMaxRound: 1](pkg.service.tournament.handler.generator.KnockoutTests)  Time elapsed: 0 sec  <<< ERROR!
java.lang.ArrayIndexOutOfBoundsException: 35
    at pkg.model.entities.RoundDefinition.hashCode(RoundDefinition.java:26)
    at java.util.HashMap.hash(HashMap.java:339)
    at java.util.HashMap.put(HashMap.java:612)
    at java.util.HashSet.add(HashSet.java:220)
    at java.util.AbstractCollection.addAll(AbstractCollection.java:344)
    at java.util.HashSet.<init>(HashSet.java:120)
    at pkg.service.tournament.handler.generator.KnockoutTests.testGenerate(KnockoutTests.java:67)