JUnit расширяет базовый класс и запускает тесты в этом классе - PullRequest
6 голосов
/ 26 января 2010

Я использую JUnit 3, и мне часто приходится проверять, правильно ли создан объект. Моя идея состояла в том, чтобы написать класс MyTestBase, как показано ниже, а затем расширить его для модульных тестов, специфичных для конкретной ситуации.

Однако в приведенном мной примере MyTests не запускает тесты в MyTestBase.

public class MyTestBase extends TestCase {
   protected String foo;
   public void testFooNotNull() {
     assertNotNull(foo);
   }
   public void testFooValue() {
     assertEquals("bar", foo);
   }
}


public class MyTests extends MyTestBase {
  public void setUp() {
    this.foo = "bar";
  }
  public void testSomethingElse() {
    assertTrue(true);
  }
}

Что я делаю не так?

Обновление Извинения. Глупая ошибка. Тесты в моем базовом классе не были названы правильно.

Ответы [ 4 ]

7 голосов
/ 26 января 2010

Вы сказали "MyTests не запускает тесты в MyTestBase." Я попробовал это сделать, и все тесты были вызваны, включая тесты в MyTestBase.

2 голосов
/ 26 января 2010

Ну, вы можете сделать MyTestBase абстрактным, чтобы он не пытался запускать тесты в базовом классе. Лучшим решением было бы иметь setUp в базовом классе и заставить его вызывать абстрактные методы (например, getFoo()) для инициализации переменных, которые потребуются позже.

На самом деле, если у вас есть эти абстрактные методы, вы можете обнаружить, что вам вообще не нужна фаза настройки - вы можете вызывать абстрактные методы там, где вам нужно значение, вместо использования переменной экземпляра. Очевидно, что это будет зависеть от конкретной ситуации, но во многих случаях это может быть намного чище.

0 голосов
/ 26 января 2010

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

Я предлагаю вам использовать Фабрику или Строитель для создания сложного объекта, а затем протестировать Фабрику (или Строителя) для правильного создания объекта.

0 голосов
/ 26 января 2010

То, что вы пытаетесь сделать, - не самый подходящий способ достижения вашей цели:

Если вы хотите иметь общую функциональность, которая делает некоторые проверки

  • определите его в служебном классе, в static методах
  • определите его в суперклассе и вызовите его из каждого метода тестирования
...