Java 多参数化JUnit测试的最佳实践

Java 多参数化JUnit测试的最佳实践,java,junit,parameterized,Java,Junit,Parameterized,通常,一个Java类有多个我们想用JUnit测试的公共方法。当两个公共方法都可以使用参数化技术时会发生什么 我们是否应该为每个要使用参数化参数测试的公共方法保留一个JUnit测试类,或者如何将两者都保留在一个JUnit测试类中 用于测试公共方法RegionUtils.translateGeographicalCity(…)的参数化JUnit测试类示例 布局:记住你不做“类测试”,你做“单元测试”。以一种有意义的方式组织和命名您的测试,这不会让代码的任何未来读者感到惊讶。通常这意味着在一个测试类中

通常,一个Java类有多个我们想用JUnit测试的公共方法。当两个公共方法都可以使用参数化技术时会发生什么

我们是否应该为每个要使用参数化参数测试的公共方法保留一个JUnit测试类,或者如何将两者都保留在一个JUnit测试类中

用于测试公共方法RegionUtils.translateGeographicalCity(…)的参数化JUnit测试类示例


布局:记住你不做“类测试”,你做“单元测试”。以一种有意义的方式组织和命名您的测试,这不会让代码的任何未来读者感到惊讶。通常这意味着在一个测试类中测试所有简单方法,每个测试类使用一个或两个参数化测试。但有时一种方法很复杂,需要更详细的测试,因此最好为其创建一个专用的测试文件

工具:您需要某种数据提供者。通常每个测试都有自己的数据提供者。有时,多个方法可以共享同一个数据提供程序。可悲的是,朱尼特在这个领域很差劲。最近出现了一些扩展JUnit的库。JUnit本身也在添加@Parameterized、@Theory等,但仍然很糟糕。因此,如果无法切换到TestNG或Spock,请尝试以下方法:

  • 如果您预先知道所有参数,请检查
  • 如果需要从文件读取数据或动态生成数据,请选中或
@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);
    }
}