JUnit je standardní framework pro modulární testování v ekosystému Java a Kotlin, který se používá ve vývoji Android pro kontrolu obchodní logiky na úrovni izolovaných komponent. Framework poskytuje sadu anotací, asertivních metod a Test Runneru pro automatickou detekci a provádění testů. Podle JUnit.org zůstává knihovna nejoblíbenějším řešením pro unit testování v ekosystému JVM: více než 70% Java projektů používá JUnit v některé z verzí.
Hlavní body
JUnit je open-source framework pro psaní a spouštění opakovatelných jednotkových testů v jazyce Java a Kotlin. Je součástí ekosystému xUnit — rodiny frameworků založených na architektuře Kenta Becka a Ericha Gammy — a je standardním testovacím nástrojem v Android Studio a IntelliJ IDEA.
Hlavním úkolem JUnit je izolovat malý fragment kódu (metodu, třídu) a ověřit jeho chování za kontrolovaných podmínek. Testy se píší jako běžné Java/Kotlin třídy s anotacemi a framework se stará o detekci testů, správu jejich životního cyklu a sběr statistik provádění.
První verze JUnit se objevila v roce 1997 a radikálně změnila přístup k vývoji, čímž popularizovala praktiky Test-Driven Development (TDD). Dnes je JUnit 5 (Jupiter) aktuální verzí, zcela přepracovanou s modulární architekturou a podporou Java 8+ a rozšíření.
Mechanismus provádění JUnit je založen na vzoru Test Runner, který skenuje classpath, nachází metody s anotací @Test, vytváří instanci testovací třídy a spouští metody v určitém pořadí. Test Runner řídí životní cyklus: volání BeforeAll → BeforeEach → Test → AfterEach → AfterAll.
JUnit obalí každou testovací metodu do samostatné instance třídy, což zaručuje izolaci mezi testy. To znamená, že pole třídy neuchovávají stav mezi různými metodami @Test — každý test začíná s čistým objektem.
Nejjednodušší test v JUnit vypadá jako metoda s anotací @Test, uvnitř které je volán testovaný kód a výsledek je kontrolován pomocí aserce. Pokud aserce neprojde — test je považován za neúspěšný a JUnit hlásí chybu.
@Test
void additionShouldReturnCorrectSum() {
var calculator = new Calculator();
var result = calculator.add(2, 3);
assertEquals(5, result);
}
Test Runner automaticky najde takovou metodu, spustí ji a ohlásí výsledek. Pokud metoda nevyvolá výjimku — test je úspěšný (green). Pokud aserce nefunguje — test selže (red).
Anotace JUnit určují, kdy a jak má být testovací kód proveden. V JUnit 5 jsou anotace v balíčku org.junit.jupiter.api a pokrývají všechny fáze: přípravu dat, provedení testu, úklid zdrojů.
| Anotace | Účel | Provádí se |
|---|---|---|
| @Test | Označuje testovací metodu | Jednou za volání |
| @BeforeEach | Příprava před každým testem | Před každým @Test |
| @BeforeAll | Jednorázová inicializace třídy | Jednou před všemi testy |
| @AfterEach | Úklid po každém testu | Po každém @Test |
| @AfterAll | Jednorázové ukončení třídy | Jednou po všech testech |
| @DisplayName | Čitelný název testu | Dekorace |
Podívejme se na kompletní testovací třídu se správným životním cyklem. Metoda setUp vytváří čerstvou instanci Calculator před každým testem a tearDown uvolňuje zdroje — například zavírá file deskriptory nebo databázová připojení.
class CalculatorTest {
private Calculator calculator;
@BeforeEach
void setUp() {
calculator = new Calculator();
}
@Test
void subtractionShouldReturnCorrectResult() {
int result = calculator.subtract(10, 4);
assertEquals(6, result);
}
@AfterEach
void tearDown() {
calculator.reset();
}
}
Aserce jsou statické metody, které porovnávají skutečný výsledek s očekávaným a vyvolávají výjimku při neshodě. JUnit 5 nabízí třídu org.junit.jupiter.api.Assertions s více než 25 metodami pro různé scénáře kontroly — od jednoduchého porovnání hodnot až po kontrolu timeoutů a skupinových asercí.
Metoda assertThrows si zaslouží zvláštní pozornost — umožňuje ověřit, že kód správně zpracovává chybové situace — dělení nulou, předání null, překročení limitů.
@Test
void divisionByZeroShouldThrowException() {
Calculator calc = new Calculator();
ArithmeticException exception = assertThrows(
ArithmeticException.class,
() -> calc.divide(10, 0)
);
assertEquals("Cannot divide by zero", exception.getMessage());
}
Parametrizované testy umožňují spustit stejnou testovací metodu s různými sadami argumentů. V JUnit 5 se k tomu používá anotace @ParameterizedTest v kombinaci se zdrojem dat — @ValueSource, @CsvSource, @MethodSource nebo @EnumSource.
Tento přístup radikálně snižuje duplicitu kódu: místo deseti identických testů pro různé hodnoty se píše jedna parametrizovaná metoda. Podle Google Testing Blog parametrizace snižuje objem testovacího kódu o 40–60% bez ztráty pokrytí.
Anotace @CsvSource předává testu několik řádků s oddělovačem čárkou. Každý řádek odpovídá jednomu spuštění testu. JUnit automaticky převádí řetězcové hodnoty na požadované typy: int, long, String a další.
@ParameterizedTest
@CsvSource({
"1, 1, 2",
"2, 3, 5",
"10, 20, 30",
"-1, 1, 0"
})
void additionWithMultipleInputs(int a, int b, int expected) {
assertEquals(expected, a + b);
}
Když jsou vstupní data složitější než jednoduchá čísla nebo řetězce, používá se @MethodSource. Odkazuje na statickou metodu, která vrací Stream argumentů — například Stream of Arguments nebo Stream objektů User pro testování DAO vrstvy.
Ve vývoji Android se JUnit používá spolu s AndroidX Test, který poskytuje rozšíření pro testování Activity, Content Provider a dalších Android komponent. JUnit je zodpovědný za jednotkové testy (unit tests) prováděné na JVM bez emulátoru a AndroidX Test za instrumentální testy na zařízení.
Pro připojení JUnit 5 do Android projektu stačí přidat závislost org.junit.jupiter:junit-jupiter v build.gradle na úrovni modulu. AGP Gradle plugin podporuje spouštění testů JUnit 5 na JVM prostřednictvím standardního Test Runneru.
// build.gradle.kts
android {
testOptions {
unitTests.isIncludeAndroidResources = true
}
}
dependencies {
testImplementation("org.junit.jupiter:junit-jupiter:5.11.0")
testImplementation("androidx.test:core-ktx:1.6.1")
}
V praxi se JUnit nejčastěji používá pro testování ViewModel a repozitářů — vrstev, které nevyžadují Android kontext nebo emulátor. Takový test se provede v milisekundách a může být spuštěn stokrát bez ztráty času.
JUnit 5 (Jupiter) není jen nová verze, ale zcela přepracovaná platforma rozdělená do tří modulů: JUnit Platform (spouštění testů na JVM), JUnit Jupiter (API pro psaní testů) a JUnit Vintage (zpětná kompatibilita s JUnit 4). Taková modularita umožňuje připojení různých Test Engine — například Spek pro Kotlin nebo TestNG.
| Charakteristika | JUnit 4 | JUnit 5 |
|---|---|---|
| Balíček | org.junit | org.junit.jupiter |
| Základní anotace | @Test (z junit.framework) | @Test (z org.junit.jupiter.api) |
| Before/After | @Before, @After, @BeforeClass | @BeforeEach, @AfterEach, @BeforeAll |
| Parameterized | @RunWith(Parameterized.class) | @ParameterizedTest + @ValueSource |
| Extension | @Rule, @ClassRule | @ExtendWith, flexibilnější API |
| Java min | Java 5 | Java 8+ |
Migrace z JUnit 4 na JUnit 5 nevyžaduje přepisování všech testů — stačí připojit JUnit Vintage Engine a staré testy budou nadále fungovat. Nové testy se doporučuje psát v JUnit 5, aby bylo možno využít rozšíření, lambdy v asercích a vestavěnou podporu pro parametrizaci.
Často kladené dotazy
JUnit je framework pro psaní a spouštění testů, zatímco Mockito je knihovna pro vytváření mock objektů. Používají se společně: JUnit řídí provádění testu a Mockito nahrazuje závislosti testované třídy.
Ano, JUnit 5 je plně kompatibilní s Android projekty. Pro unit testy stačí přidat závislost junit-jupiter v build.gradle. Instrumentální testy nadále fungují přes AndroidX Test Runner.
Minimálně stačí jedna anotace @Test před metodou. Pro inicializaci a úklid se doporučují @BeforeEach a @AfterEach, ale nejsou povinné.
Test Runner je komponenta JUnit, která skenuje classpath, nachází metody s anotací @Test, vytváří instance testovacích tříd a spouští testy. V JUnit 5 tuto roli plní JUnit Platform s připojenými Test Engines.
Použijte assertThrows(Class, Executable) — přijímá typ očekávané výjimky a lambdu s voláním metody. JUnit ověří, že výjimka byla skutečně vyvolána, a vrátí ji pro další kontrolu.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také