JUnit: co to je, klíčové pojmy a jak funguje

Autor: IT Sectr Publikováno: 2026-04-08 Doba čtení: 8 min

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 — open-source framework pro modulární testování kódu Java a Kotlin.
  • Anotace — @Test, @BeforeEach, @BeforeAll řídí životní cyklus testovací třídy.
  • Aserce — assertEquals, assertTrue, assertThrows kontrolují očekávané výsledky.
  • Parametrizované testy — umožňují spustit jeden test s různými sadami vstupních dat.
  • Test Runner — infrastruktura JUnit automaticky najde a spustí všechny testy v projektu.

Co je JUnit?

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í.

Jak funguje JUnit

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.

Životní cyklus testovací třídy

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.

Základní struktura testu

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.

java
@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: životní cyklus testu

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ÚčelProvádí se
@TestOznačuje testovací metoduJednou za volání
@BeforeEachPříprava před každým testemPřed každým @Test
@BeforeAllJednorázová inicializace třídyJednou před všemi testy
@AfterEachÚklid po každém testuPo každém @Test
@AfterAllJednorázové ukončení třídyJednou po všech testech
@DisplayNameČitelný název testuDekorace

Příklad použití anotací

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í.

java
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: kontrola výsledků v JUnit

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í.

  • assertEquals(expected, actual) — kontroluje rovnost pomocí equals().
  • assertTrue(condition) — kontroluje, že podmínka je pravdivá.
  • assertFalse(condition) — kontroluje, že podmínka je nepravdivá.
  • assertNotNull(object) — kontroluje, že objekt není null.
  • assertNull(object) — kontroluje, že objekt je null.
  • assertThrows(exception, executable) — kontroluje, že kód vyvolá zadanou výjimku.
  • assertAll(executables) — seskupí více kontrol a provede všechny bez zastavení na první chybě.

assertThrows pro kontrolu výjimek

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ů.

java
@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 v JUnit

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í.

Příklad s CsvSource

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ší.

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

MethodSource pro komplexní objekty

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.

Integrace JUnit s Android projekty

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í.

Nastavení Gradle

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.

kotlin
// 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")
}

Testování ViewModel s JUnit

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.

  • ViewModel — kontrola stavů: loading, success, error.
  • Repository — kontrola mapování dat a zpracování chyb.
  • UseCase — kontrola business logiky s mocky závislostí.

JUnit 4 vs JUnit 5: klíčové rozdíly

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.

CharakteristikaJUnit 4JUnit 5
Balíčekorg.junitorg.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 minJava 5Java 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

Čím se liší JUnit od Mockito?

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.

Lze JUnit 5 použít v Android projektech?

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.

Jaká je minimální sada anotací potřebná pro test?

Minimálně stačí jedna anotace @Test před metodou. Pro inicializaci a úklid se doporučují @BeforeEach a @AfterEach, ale nejsou povinné.

Co je Test Runner v JUnit?

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.

Jak zkontrolovat, že metoda vyvolá výjimku?

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í

  • JUnit — standardní framework pro jednotkové testování pro Java a Kotlin, základ ekosystému xUnit.
  • Anotace @Test, @BeforeEach, @AfterEach řídí životní cyklus testovací třídy.
  • Aserce — assertEquals, assertTrue, assertThrows kontrolují správnost výsledků.
  • Parametrizované testy s @CsvSource a @MethodSource snižují duplicitu kódu.
  • JUnit 5 — modulární architektura s platformou, Jupiter API a podporou rozšíření.
  • Android integrace — JUnit běží na JVM přes standardní Test Runner bez emulátoru.
  • Test Runner automaticky detekuje a spouští @Test metody a hlásí výsledky.

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í.

Prodiskutovat projekt

Přečtěte si také