如何减少多个 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 或被测方法做得太多了。打破它,测试方法变得更简单。
我有一个 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 或被测方法做得太多了。打破它,测试方法变得更简单。