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);
}
}