2015-02-21 4 views
4

Часто Java-класс имеет более одного общедоступного метода, который мы хотим протестировать с помощью JUnit. Что происходит, когда оба общедоступных метода - это то, что мы можем использовать Параметризированные методы?Лучшая практика для нескольких параметризованных тестов 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); 
    } 
} 

ответ

1

макета: помните, что вы не делаете «класс тестирования», вы «модульное тестирование». организовывать и называть ваши тесты значимым образом, что не удивит будущих читателей вашего кода. обычно это означает тестирование всех простых методов в одном тестовом классе с использованием одного или двух параметризованных тестов для каждого. но иногда один метод сложный и требует гораздо более детального тестирования, и тогда может быть хорошей идеей создать для него выделенный тестовый файл.

Инструменты: вам нужны какие-то поставщики данных. то обычно каждый тест имеет свои собственные поставщики данных. иногда несколько методов могут совместно использовать один и тот же поставщик данных. К сожалению, Юнит сосет на этом поле. недавно появились некоторые библиотеки, расширяющие JUnit. также JUnit сам по себе добавляет @Parameterized, @ Theories и т. д., но все же - это отстой. так что если вы не можете переключиться на TestNG или Спока попробовать эти: