Java 如何减少多个JUnit断言的代码?

Java 如何减少多个JUnit断言的代码?,java,junit,refactoring,tdd,testng,Java,Junit,Refactoring,Tdd,Testng,我有一个由assertEquals形成的大规模(300行)测试方法,即: 有没有办法重构这个?(也许是反思?) 提前感谢。如果您的模型有许多字段要检查,实际上,您没有选择权检查每个字段的值 现在,您处理该问题的方式可能不是最合适的解决方案,因为如果您想使用另一个测试用例的tmParamResult实例执行equals断言,您应该为每个字段重写所有Assert.Assert(…)。 您可以创建一个私有方法,该方法将预期的和实际的tmParamResult作为参数。这样,对于每个场景,您只需要为某些

我有一个由assertEquals形成的大规模(300行)测试方法,即:

有没有办法重构这个?(也许是反思?)


提前感谢。

如果您的模型有许多字段要检查,实际上,您没有选择权检查每个字段的值

现在,您处理该问题的方式可能不是最合适的解决方案,因为如果您想使用另一个测试用例的
tmParamResult
实例执行equals断言,您应该为每个字段重写所有
Assert.Assert(…)

您可以创建一个私有方法,该方法将预期的和实际的
tmParamResult
作为参数。这样,对于每个场景,您只需要为某些场景创建另一个预期实例,其中可能包含一些预定义的值

tmParamResult
可能是一张地图,但我不喜欢猜测

@Test
public void assertTmParamResultEquals(TmParamResult tmParamResultActual,TmParamResult tmParamResultExpected){
  assertEquals( 
  tmParamResultExpected.get(TagmanConstants.COUNTRY),
  tmParamResultActual.get(TagmanConstants.COUNTRY)
  ....
 )

更新 若您使用Map对象,那个么可以使用unitils库来执行基于反射的断言。 您可以在此处找到更多信息:

Maven依赖项:

<dependency>
    <groupId>org.unitils</groupId>
    <artifactId>unitils-test</artifactId>
    <version>3.4.3</version>
</dependency>

对我来说,拥有如此大的测试方法表明被测试的类或方法做得太多了。把它们分开,测试方法就会变得更简单。

你可以把常数放在数组或列表中,然后在其中循环。我认为没有必要这样做。这些是测试代码,它们很清楚。这些值是什么?默认值?测试方法的目的是什么?你重构这个的目标是什么?它已经是每个测试一行了,你不可能让它变小。如果你使用了反射,这会不会违背测试的目的,因为你会使用代码本身来测试代码本身?@grape_mao我真的认为这是必要的。我们谈论的是300多行assertEquals。@T.J.Crowder有时是默认值,有时不是。在我看来,目的是很清楚的,通过观察,只是检查变量的期望值是否与我们得到的相同。不要认为反射会“击败”它,它只会使代码更加清晰。
<dependency>
    <groupId>org.unitils</groupId>
    <artifactId>unitils-test</artifactId>
    <version>3.4.3</version>
</dependency>
@Test
public void assertMap() throws Exception {
  Map<String, String> expectedMap = new HashMap<String, String>();
  expectedMap.put("a", "1");
  expectedMap.put("b", "2");

  Map<String, String> actualMap = new HashMap<String, String>();
  actualMap.put("b", "2");
  actualMap.put("a", "1");

  ReflectionAssert.assertReflectionEquals(expectedMap, actualMap, ReflectionComparatorMode.LENIENT_ORDER);

}
@Test
public void assertTmParamResultEquals(TmParamResult tmParamResultActual,TmParamResult tmParamResultExpected){
  ReflectionAssert.assertReflectionEquals(tmParamResultExpected, tmParamResultActual, ReflectionComparatorMode.LENIENT_ORDER);
 )