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

How to reduce code for multiple JUnit assertions?

我有一个 massive(300 行)测试方法,由 assertEquals 构成,即:

assertEquals(tmParamResult.get(TagmanConstants.COUNTRY), COUNTRY_UK);
assertEquals(tmParamResult.get(TagmanConstants.STATE), EMPTY_STRING);
assertEquals(tmParamResult.get(TagmanConstants.LOYALTY_CARD), String.valueOf(false));
assertEquals(tmParamResult.get(TagmanConstants.REGISTERED), String.valueOf(false));
assertEquals(tmParamResult.get(TagmanConstants.REG_USER_ID), EMPTY_STRING);
assertEquals(tmParamResult.get(TagmanConstants.REG_DATE), EMPTY_STRING);
assertEquals(tmParamResult.get(TagmanConstants.REG_DAY), EMPTY_STRING);
assertEquals(tmParamResult.get(TagmanConstants.REG_MONTH), EMPTY_STRING);
assertEquals(tmParamResult.get(TagmanConstants.REG_YEAR), EMPTY_STRING);
assertEquals(tmParamResult.get(TagmanConstants.SMS_SERVICE), String.valueOf(false));
assertEquals(tmParamResult.get(TagmanConstants.IS_INT), String.valueOf(false));

有什么方法可以重构这个吗? (反思,也许?)

提前致谢。

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

现在,您处理该问题的方式可能不是最合适的解决方案,因为如果您想对另一个测试用例的 tmParamResult 实例进行等于断言,您应该重写所有 Assert.assert(...)每个字段。
您可以创建一个私有方法,它将预期的和实际的 tmParamResult 作为参数。这样,对于每个场景,您只需要创建另一个预期实例,其中可能有一些场景的预定义值。

tmParamResult 可能是一个地图,但我不想猜测。

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

更新 如果你使用 Map 对象,你可以使用 unitils 库来执行基于反射的断言。 您可以在这里找到更多信息:http://www.unitils.org/tutorial-reflectionassert.html

Maven 依赖:

<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);
 )

对我来说,拥有如此庞大的测试方法表明 class 或被测方法做得太多了。打破它,测试方法变得更简单。