通常,Java类有多个我们想要使用JUnit测试的公共方法。当两种公共方法都是我们可以使用的参数化技术时会发生什么?
我们是否应该为每个要使用参数化参数测试的公共方法保留一个JUnit Test类,或者我们如何将它们保存在一个JUnit Test类中?
示例参数化JUnit Test类,用于测试公共方法RegionUtils.translateGeographicalCity(...)
@RunWith(Parameterized.class)
public class RegionUtilsTest {
private String geographicalCity;
private String expectedAwsRegionCode;
public RegionUtilsTest(final String geographicalCity,
final String expectedAwsRegionCode) {
this.geographicalCity = geographicalCity;
this.expectedAwsRegionCode = expectedAwsRegionCode;
}
@Parameters(name = "translateGeographicalCity({0}) should return {1}")
public static Collection geographicalCityToAwsRegionCodeMapping() {
// geographical city, aws region code
return Arrays.asList(new Object[][] { { "Tokyo", "ap-northeast-1" },
{ "Sydney", "ap-southeast-2" },
{ "North Virginia", "us-east-1" }, { "Oregan", "us-west-2" },
{ "N.California", "us-west-1" }, { "Ireland", "eu-west-1" },
{ "Frankfurt", "eu-central-1" }, { "Sao Paulo", "sa-east-1" },
{ "Singapore", "ap-southeast-1" } });
}
@Test
public void translateGeographicalCityShouldTranslateToTheCorrectAwsRegionCode() {
assertThat(
"The AWS Region Code is incorrectly mapped.",
expectedAwsRegionCode,
equalTo(RegionUtils.translateGeographicalCity(geographicalCity)));
}
@Test(expected = NamedSystemException.class)
public void translateGeographicalCityShouldThroughAnExceptionIfTheGeographicalCityIsUnknown() {
final String randomGeographicalCity = RandomStringUtils
.randomAlphabetic(10);
RegionUtils.translateGeographicalCity(randomGeographicalCity);
}
}
答案 0 :(得分:1)
布局:记住你不做'课堂测试',你做'单元测试'。以有意义的方式组织和命名您的测试,这不会让您的代码的未来读者感到惊讶。通常它意味着在一个测试类中测试所有简单方法,每个测试类使用一个或两个参数化测试。但有时一种方法很复杂,需要更详细的测试,然后为它创建一个专用的测试文件可能是个好主意
工具:您需要某种数据提供者。那么通常每个测试都有自己的数据提供者。有时多个方法可以共享同一个数据提供者。可悲的是,JUnit糟透了这个领域。最近出现了一些扩展JUnit的库。另外JUnit本身就是添加@Parameterized,@ Theories等,但仍然 - 很糟糕。所以如果你不能切换到TestNG或Spock尝试这些: