Как иметь несколько установок для разных наборов тестов JUnit? - PullRequest
1 голос
/ 22 апреля 2020

Я только недавно начал изучать JUnit и столкнулся со следующей проблемой.

Посмотрите на следующий класс

class MyClass {
  String a;

  public MyClass(String a) {
    this.a=a;

  String doSomething(String a) {
    if( a.isEmpty() )
      return "isEmpty";
    else
      return"isNotEmpty";
}

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

class MyClassTest {

  MyClass myClass;

  @BeforeEach
  void setUp() {
    myClass=new MyClass("sampleString");
  }

  @Test
  void doSomethingTest() {
    Assertions.equal("isNotEmpty", myClass.doSomething());
  }
}

Однако для тестирования условия пустой строки мне понадобится другой метод установки, где вместо "sampleString" я передаю пустой string.

Ниже приведены подходы, которые я могу придумать, и вопросы для каждого из них:

  • Не использовать setUp вообще, а вместо этого инициализировать класс в отдельном методе тестирования. Однако, если скажем, есть 10 тестовых случаев; 5 из которых требуют пустой строки и отдыха "sampleString", тогда это не имеет смысла. Опять же, мы можем иметь отдельный метод для этого повторяющегося кода и вызывать его индивидуально в каждом тестовом примере, но тогда это противоречит цели использования метода повышения. Допустим, я хотел использовать два разных метода настройки, есть ли способ сделать это?
  • Есть параметризованная настройка. Я не знаю, возможно ли это, хотя. Если да, пожалуйста, поделитесь некоторыми полезными ссылками для этого.
  • Используйте TestFactory. Я попытался прочитать об этом, но не смог найти пример для этого конкретного случая c. Если у вас есть, пожалуйста, поделитесь.

Этот пример был прост для иллюстративных целей.

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

Сгруппируйте тесты с одинаковыми настройками во внутренний класс, помеченный @Nested. Каждый вложенный тестовый класс может иметь свою собственную настройку в локальном методе @BeforeEach.

0 голосов
/ 22 апреля 2020

Вы всегда можете подготовить необычные данные в вашем методе тестирования. Я всегда думал, что так проще, по сравнению с использованием параметризованных тестов. Нельзя смешивать параметризованные и непараметрические тесты в 1 файле.

@Test
void doSomething_nullString()
{
    myClass = new MyClass(null);
    Assert.assertNull(myClass.doSomething());
}

@Test
void doSomething_emptyString()
{
    myClass = new MyClass("");
    Assert.assertEquals("", myClass.doSomething());
}

@Test
void doSomething_nonEmptyString()
{
    myClass = new MyClass("sampleString");
    Assert.assertEquals("sampleString", myClass.doSomething());
}

Или же вы всегда можете иметь вспомогательные методы внутри класса теста.

private MyClass createTestObject_nonNullString() {
    return new MyClass("nonNullString");
}

private MyClass createTestObject_nullString() {
    return new MyClass(null);
}

@Test
public void doSomething_sample() {

    MyClass test = createTestObject_nonNullString();
    // perform test
}
...