реализация Junit нескольких бегунов - PullRequest
7 голосов
/ 21 октября 2011

Я пытался создать персонализированный набор тестов, создав подходящего раннера. В наборе тестов, помеченном @RunWith(suiterunner.class), я имею в виду классы тестов, которые необходимо выполнить.

В тестовом классе мне нужно повторить определенный тест, для этого я использую решение, как указано здесь: http://codehowtos.blogspot.com/2011/04/run-junit-test-repeatedly.html. но так как я создал подходящее приложение, которое запускает тестовый класс, и в этом тестовом классе я реализую @RunWith(ExtendedRunner.class), возникает ошибка инициализации.

Мне нужна помощь в управлении этими 2 бегунами, а также есть ли способ объединить 2 бегуна для определенного теста? Есть ли другой способ решить эту проблему или какой-нибудь более простой путь?

1 Ответ

2 голосов
/ 04 июня 2013

Если вы используете последнюю версию JUnit, вы можете @Rules быть более чистым решением вашей проблемы. Вот образец;

Представьте, что это ваше приложение;

package org.zero.samples.junit;

/**
 * Hello world!
 * 
 */
public class App {
  public static void main(String[] args) {
    System.out.println(new App().getMessage());
  }

  String getMessage() {
    return "Hello, world!";
  }
}

Это ваш тестовый класс;

package org.zero.samples.junit;

import static org.junit.Assert.*;

import org.junit.Rule;
import org.junit.Test;

/**
 * Unit test for simple App.
 */
public class AppTest {

  @Rule
  public RepeatRule repeatRule = new RepeatRule(3); // Note Rule

  @Test
  public void testMessage() {
    assertEquals("Hello, world!", new App().getMessage());
  }
}

Создайте класс правил, как;

package org.zero.samples.junit;

import org.junit.rules.TestRule;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;

public class RepeatRule implements TestRule {

  private int repeatFor;

  public RepeatRule(int repeatFor) {
    this.repeatFor = repeatFor;
  }

  public Statement apply(final Statement base, Description description) {
    return new Statement() {

      @Override
      public void evaluate() throws Throwable {
        for (int i = 0; i < repeatFor; i++) {
          base.evaluate();
        }
      }
    };
  }

}

Выполните ваш тестовый пример как обычно, только на этот раз ваши тестовые примеры будут повторяться указанное количество раз. Вы можете найти интересные случаи использования, когда @Rule может оказаться действительно полезным. Попробуйте создать составные правила, игра вокруг вас наверняка склеится ..

Надеюсь, это поможет.

...