基于枚举测试条件
Testing a Condtional Based on Enum
当条件基于枚举方法时,我是否应该在单元测试中测试每个条件?
我的意思是如果我有一个包含很多值的枚举,单元测试就会变得太大而无法达到所有可能的条件。
示例:
public enum AnEnum {
A(true), B(false), C(false), D(true);
AnEnum(boolean isError) {
this.isError = isError
}
}
public class TestEnum {
public String method(AnEnum anEnum) {
if( anEnum.isError() ) {
return "An Error";
}
return "Not An Error";
}
}
您可以使用 ParametrizedTests,例如:
@DataProvider
public static Object[][] provideEnumasAndExpectedErrorResult() {
return new Object[][] {
{ AnEnum.A, true },
{ AnEnum.B, false }
};
}
@Test
@UseDataProvider( "provideEnumasAndExpectedErrorResult" )
public void testEnumErrors( AnEnum enumConstant, boolean expectedResult expectedResult ) {
assertThat( enumConstant.isError(), is(expectedResult));
这使您可以(以某种方式)更清晰的方式写下所有枚举和预期结果。
数据驱动的测试非常适合 Spock:
class AnEnumSpec extends Specification {
def "has correct error status"() {
expect:
result == anEnum.isError
where:
anEnum | result
AnEnum.A | true
AnEnum.B | false
AnEnum.C | false
AnEnum.D | true
}
}
当条件基于枚举方法时,我是否应该在单元测试中测试每个条件?
我的意思是如果我有一个包含很多值的枚举,单元测试就会变得太大而无法达到所有可能的条件。
示例:
public enum AnEnum {
A(true), B(false), C(false), D(true);
AnEnum(boolean isError) {
this.isError = isError
}
}
public class TestEnum {
public String method(AnEnum anEnum) {
if( anEnum.isError() ) {
return "An Error";
}
return "Not An Error";
}
}
您可以使用 ParametrizedTests,例如:
@DataProvider
public static Object[][] provideEnumasAndExpectedErrorResult() {
return new Object[][] {
{ AnEnum.A, true },
{ AnEnum.B, false }
};
}
@Test
@UseDataProvider( "provideEnumasAndExpectedErrorResult" )
public void testEnumErrors( AnEnum enumConstant, boolean expectedResult expectedResult ) {
assertThat( enumConstant.isError(), is(expectedResult));
这使您可以(以某种方式)更清晰的方式写下所有枚举和预期结果。
数据驱动的测试非常适合 Spock:
class AnEnumSpec extends Specification {
def "has correct error status"() {
expect:
result == anEnum.isError
where:
anEnum | result
AnEnum.A | true
AnEnum.B | false
AnEnum.C | false
AnEnum.D | true
}
}