JUnit - makstron/info GitHub Wiki

Основные аннотации

  • @Before - обозначает методы, которые будут вызваны до исполнения теста, методы должны быть public void. Здесь обычно размещаются предустановки для теста.
  • @BeforeClass - обозначает методы, которые будут вызваны до создания экземпляра тест-класса, методы должны быть public static void. Имеет смысл размещать предустановки для теста в случае, когда класс содержит несколько тестов использующих различные предустановки, либо когда несколько тестов используют одни и те же данные, чтобы не тратить время на их создание для каждого теста.
  • @After - обозначает методы, которые будут вызваны после выполнения теста, методы должны быть public void. Здесь размещаются операции освобождения ресурсов после теста.
  • @AfterClass - связана по смыслу с @BeforeClass, но выполняет методы после теста, методы должны быть public static void.
  • @Test - обозначает тестовые методы. Методы должны быть public void. Здесь размещаются сами проверки. Кроме того, у данной аннотации есть два параметра, expected — задает ожидаемое исключение и timeout — задает время, по истечению которого тест считается провалившимся.
  • @Ignore - игнорирует тест или все тесты класса
@Test(expected = NullPointerException.class)
public void testToHexStringWrong() {
  StringUtils.toHexString(null);
}

@Test(timeout = 1000)
public void infinity() {
  while (true);
}

Правила

Правила это некое подобие утилит для тестов, которые добавляют функционал до и после выполнения теста.

Для объявления правила необходимо создать public не static поле типа производного от MethodRule и зааннотировать его с помощью @Rule.

  • @Rule - аннотация для правила перед каждым тестом
  • @ClassRule - аннотация для правила перед всеми тестами в классе
  • @RuleChain - последовательность правил

Custom rule

public class OpenFeedbackRule implements TestRule {
    @Override public Statement apply(final Statement base, final Description description) {
        return new Statement() {
            @Override public void evaluate() throws Throwable {
                //actions before a test
                try {
                    base.evaluate(); // This will run the test.
                } finally {
                    //actions after a test
                }
            }
        };
    }
}
public static class UseRuleChain {
    @Rule
    public RuleChain chain= RuleChain
    .outerRule(new LoggingRule("outer rule")
    .around(new LoggingRule("middle rule")
    .around(new LoggingRule("inner rule");

    @Test
    public void example() {
        assertTrue(true);
    }
}

writes the log
starting outer rule
starting middle rule
starting inner rule
finished inner rule
finished middle rule
finished outer rule

Запускалки

  • JUnit4 — запускалка по умолчанию, как понятно из названия, предназначена для запуска JUnit 4 тестов.
  • Suite — В эту передается класс со статическим методом suite возвращающим тест(последовательность всех тестов). Для настройки запускаемых тестов используется аннотация @SuiteClasses.
@Suite.SuiteClasses( { OtherJUnit4Test.class, StringUtilsJUnit4Test.class })
@RunWith(Suite.class)
public class JUnit4TestSuite {
}
  • Enclosed — то же, что и предыдущий вариант, но вместо настройки с помощью аннотации используются все внутренние классы.
  • Categories — попытка организовать тесты в категории(группы). Для этого тестам задается категория с помощью @Category, затем настраиваются запускаемые категории тестов в сюите.
public class StringUtilsJUnit4CategoriesTest extends Assert {
  //...

  @Category(Unit.class)
  @Test
  public void testIsEmpty() {
    //...
  }

  //...
}

@RunWith(Categories.class)
@Categories.IncludeCategory(Unit.class)
@Suite.SuiteClasses( { OtherJUnit4Test.class, StringUtilsJUnit4CategoriesTest.class })
public class JUnit4TestSuite {
}
  • Parameterized — позволяет писать параметризированные тесты. Для этого в тест-классе объявляется статический метод возвращающий список данных, которые затем будут использованы в качестве аргументов конструктора класса.
@RunWith(Parameterized.class)
public class StringUtilsJUnit4ParameterizedTest extends Assert {
  private final CharSequence testData;
  private final boolean expected;

  public StringUtilsJUnit4ParameterizedTest(final CharSequence testData, final boolean expected) {
    this.testData = testData;
    this.expected = expected;
  }

  @Test
  public void testIsEmpty() {
    final boolean actual = StringUtils.isEmpty(testData);
    assertEquals(expected, actual);
  }

  @Parameterized.Parameters
  public static List<Object[]> isEmptyData() {
    return Arrays.asList(new Object[][] {
      { null, true },
      { "", true },
      { " ", false },
      { "some string", false },
    });
  }
}
  • Theories — чем-то схожа с предыдущей, но параметризирует тестовый метод, а не конструктор. Данные помечаются с помощью @DataPoints и @DataPoint, тестовый метод — с помощью @Theory. Тест использующий этот функционал будет выглядеть примерно так:
@RunWith(Theories.class)
public class StringUtilsJUnit4TheoryTest extends Assert {

  @DataPoints
  public static Object[][] isEmptyData = new Object[][] {
      { "", true },
      { " ", false },
      { "some string", false },
  };

  @DataPoint
  public static Object[] nullData = new Object[] { null, true };

  @Theory
  public void testEmpty(final Object... testData) {
    final boolean actual = StringUtils.isEmpty((CharSequence) testData[0]);
    assertEquals(testData[1], actual);
  }
}

Source
Source

⚠️ **GitHub.com Fallback** ⚠️