JUnit: τι είναι, βασικές έννοιες και πώς λειτουργεί

Συγγραφέας: IT Sectr Δημοσιεύτηκε: 2026-04-08 Χρόνος ανάγνωσης: 8 λεπ

Το JUnit είναι ένα τυπικό framework για αρθρωματικές δοκιμές στο οικοσύστημα Java και Kotlin, που χρησιμοποιείται στην ανάπτυξη Android για τον έλεγχο της επιχειρηματικής λογικής σε επίπεδο απομονωμένων συνιστωσών. Το framework παρέχει ένα σύνολο από annotations, μεθόδους assertion και Test Runner για αυτόματη ανίχνευση και εκτέλεση δοκιμών. Σύμφωνα με τα δεδομένα του JUnit.org, η βιβλιοθήκη παραμένει η δημοφιλέστερη λύση για μοναδικές δοκιμές στο οικοσύστημα JVM: περισσότερο από 70% των εργων Java χρησιμοποιούν JUnit σε οποιαδήποτε έκδοση.

Βασικά σημεία

  • JUnit — ανοιχτού κώδικα framework για αρθρωματική δοκιμή κώδικα Java και Kotlin.
  • Annotations — @Test, @BeforeEach, @BeforeAll διαχειρίζονται τον κύκλο ζωής της κλάσης δοκιμής.
  • Assertions — assertEquals, assertTrue, assertThrows ελέγχουν τα αναμενόμενα αποτελέσματα.
  • Παραμετροποιημένες δοκιμές — επιτρέπουν την εκτέλεση μιας δοκιμής με διαφορετικά σύνολα εισόδου.
  • Test Runner — η υποδομή JUnit βρίσκει και εκτελεί αυτόματα όλες τις δοκιμές στο έργο.

Τι είναι το JUnit;

Το JUnit είναι ένα framework ανοιχτού κώδικα για τη σύνταξη και εκτέλεση επαναλαμβανόμενων αρθρωματικών δοκιμών σε Java και Kotlin. Ανήκει στο οικοσύστημα xUnit — μια οικογένεια frameworks που βασίζονται στην αρχιτεκτονική των Kent Beck και Erich Gamma, και είναι το τυπικό εργαλείο δοκιμών στο Android Studio και στο IntelliJ IDEA.

Η κύρια αποστολή του JUnit είναι να απομονώσει ένα μικρό τμήμα κώδικα (μέθοδο, κλάση) και να ελέγξει τη συμπεριφορά του σε ελεγχόμενες συνθήκες. Οι δοκιμές γράφονται ως συνηθισμένες κλάσεις Java/Kotlin με annotations, και το framework αναλαμβάνει την ανίχνευση δοκιμών, την διαχείριση του κύκλου ζωής τους και τη συλλογή στατιστικών εκτέλεσης.

Η πρώτη έκδοση του JUnit εμφανίστηκε το 1997 και άλλαξε ριζικά την προσέγγιση στην ανάπτυξη, διαδίδοντας τις πρακτικές Test-Driven Development (TDD). Σήμερα, το JUnit 5 (Jupiter) είναι η τρέχουσα έκδοση, πλήρως επανασχεδιασμένη με αρθρωματική αρχιτεκτονική και υποστήριξη για Java 8+ και επεκτάσεις.

Πώς λειτουργεί το JUnit

Ο μηχανισμός εκτέλεσης του JUnit βασίζεται στο μοτίβο Test Runner, το οποίο σαρώνει το classpath, βρίσκει μεθόδους με την annotation @Test, δημιουργεί ένα στοιχείο της κλάσης δοκιμής και εκτελεί τις μεθόδους σε μια συγκεκριμένη σειρά. Το Test Runner διαχειρίζεται τον κύκλο ζωής: κλήση BeforeAll → BeforeEach → Test → AfterEach → AfterAll.

Κύκλος ζωής της κλάσης δοκιμής

Το JUnit περιτυλίσσει κάθε μέθοδο δοκιμής σε ξεχωριστό στοιχείο της κλάσης, πράγμα που εγγυάται απομόνωση μεταξύ δοκιμών. Αυτό σημαίνει ότι τα πεδία της κλάσης δεν διατηρούν κατάσταση μεταξύ διαφορετικών μεθόδων @Test — κάθε δοκιμή ξεκινάει με ένα καθαρό αντικείμενο.

Βασική δομή δοκιμής

Η απλούστερη δοκιμή στο JUnit μοιάζει με μία μέθοδο με την annotation @Test, μέσα στην οποία καλείται ο δοκιμαζόμενος κώδικας και ελέγχεται το αποτέλεσμα μέσω μιας assertion. Εάν η assertion αποτύχει — η δοκιμή θεωρείται αποτυχημένη και το JUnit αναφέρει σφάλμα.

java
@Test
void additionShouldReturnCorrectSum() {
    var calculator = new Calculator();
    var result = calculator.add(2, 3);
    assertEquals(5, result);
}

Το Test Runner βρίσκει αυτόματα μία τέτοια μέθοδο, την εκτελεί και αναφέρει το αποτέλεσμα. Εάν η μέθοδος δεν πετάει εξαίρεση — η δοκιμή είναι επιτυχημένη (green). Εάν η assertion δεν λειτουργεί — η δοκιμή αποτυχάνει (red).

Annotations JUnit: κύκλος ζωής δοκιμής

Οι annotations του JUnit καθορίζουν πότε και πώς πρέπει να εκτελείται ο κώδικας δοκιμής. Στο JUnit 5, οι annotations βρίσκονται στο πακέτο org.junit.jupiter.api και καλύπτουν όλα τα στάδια: προετοιμασία δεδομένων, εκτέλεση δοκιμής, καθαρισμός πόρων.

AnnotationΣκοπόςΕκτέλεση
@TestΣημαιώνει τη μέθοδο δοκιμήςΜία φορά ανά κλήση
@BeforeEachΠροετοιμασία πριν από κάθε δοκιμήΠριν από κάθε @Test
@BeforeAllΕφάπαξ αρχικοποίηση της κλάσηςΜία φορά πριν από όλες τις δοκιμές
@AfterEachΚαθαρισμός μετά από κάθε δοκιμήΜετά από κάθε @Test
@AfterAllΕφάπαξ ολοκλήρωση της κλάσηςΜία φορά μετά από όλες τις δοκιμές
@DisplayNameΑναγνώσιμο όνομα δοκιμήςΔιακόσμηση

Παράδειγμα χρήσης annotations

Ας δούμε μια πλήρη κλάση δοκιμής με σωστό κύκλο ζωής. Η μέθοδος setUp δημιουργεί μία νέα περίπτωση Calculator πριν από κάθε δοκιμή, και η tearDown απελευθερώνει πόρους — για παράδειγμα, κλείνει δείκτες αρχείων ή συνδέσεις βάσης δεδομένων.

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

Assertions: έλεγχος αποτελεσμάτων στο JUnit

Οι Assertions είναι στατικές μεθοδοι που συγκρίνουν το πραγματικό αποτέλεσμα με το αναμενόμενο και πετάνε εξαίρεση σε περίπτωση αναντιστοιχίας. Το JUnit 5 προσφέρει την κλάση org.junit.jupiter.api.Assertions με πάνω από 25 μεθόδους για διαφορετικά σενάρια ελέγχου — από την απλή σύγκριση τιμών μέχρι τον έλεγχο timeout και ομαδικών assertions.

  • assertEquals(expected, actual) — ελέγχει την ισότητα μέσω equals().
  • assertTrue(condition) — ελέγχει ότι η συνθήκη είναι αληθής.
  • assertFalse(condition) — ελέγχει ότι η συνθήκη είναι ψευδής.
  • assertNotNull(object) — ελέγχει ότι το αντικείμενο δεν είναι null.
  • assertNull(object) — ελέγχει ότι το αντικείμενο είναι null.
  • assertThrows(exception, executable) — ελέγχει ότι ο κώδικας πετάει την καθορισμένη εξαίρεση.
  • assertAll(executables) — ομαδοποιεί πολλά διαβασματικά και τα εκτελεί όλα χωρίς να σταματάει στο πρώτο σφάλμα.

assertThrows για έλεγχο εξαιρέσεων

Η μέθοδος assertThrows αξίζει ιδιαίτερη προσοχή — επιτρέπει τον έλεγχο ότι ο κώδικας διαχειρίζεται σωστά τις λανθασμένες καταστάσεις — διαίρεση διά μηδενός, μεταβίβαση null, υπέρβαση ορίων.

java
@Test
void divisionByZeroShouldThrowException() {
    Calculator calc = new Calculator();

    ArithmeticException exception = assertThrows(
        ArithmeticException.class,
        () -> calc.divide(10, 0)
    );

    assertEquals("Cannot divide by zero", exception.getMessage());
}

Παραμετροποιημένες δοκιμές στο JUnit

Οι παραμετροποιημένες δοκιμές επιτρέπουν την εκτέλεση της ίδιας μεθόδου δοκιμής με διαφορετικά σύνολα ορισμάτων. Στο JUnit 5, για αυτό χρησιμοποιείται η annotation @ParameterizedTest σε συνδυασμό με μια πηγή δεδομένων — @ValueSource, @CsvSource, @MethodSource ή @EnumSource.

Αυτή η προσέγγιση μειώνει δραστικά την επανάληψη κώδικα: αντί για δέκα παρόμοιες δοκιμές για διαφορετικές τιμές, γράφεται μία παραμετροποιημένη μέθοδος. Σύμφωνα με το Google Testing Blog, η παραμετροποίηση μειώνει τον όγκο κώδικα δοκιμής κατά 40–60% χωρίς απώλεια καλύψης.

Παράδειγμα με CsvSource

Η annotation @CsvSource στέλνει πολλές γραμμές με διαχωριστή το κόμμα στη δοκιμή. Κάθε γραμμή αντιστοιχεί σε μία εκτέλεση δοκιμής. Το JUnit μετατρέπει αυτόματα τις τιμές συμβολοσειρών στους απαιτούμενους τύπους: int, long, String και άλλα.

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 για σύνθετα αντικείμενα

Όταν τα δεδομένα εισόδου είναι πιο σύνθετα από απλούς αριθμούς ή συμβολοσειρές, χρησιμοποιείται το @MethodSource. Αναφέρεται σε μια στατική μέθοδο που επιστρέφει ένα Stream ορισμάτων — για παράδειγμα, Stream of Arguments ή ένα Stream αντικειμένων User για τη δοκιμή του επιπέδου DAO.

Ενσωμάτωση JUnit με έργα Android

Στην ανάπτυξη Android, το JUnit χρησιμοποιείται με το AndroidX Test, το οποίο παρέχει επεκτάσεις για τη δοκιμή Activity, Content Provider και άλλων συνιστωσών Android. Το JUnit είναι υπεύθυνο για τις αρθρωματικές δοκιμές (unit tests) που εκτελούνται στο JVM χωρίς εμπλαιστηωτή, και το AndroidX Test για τις εργαλειακές δοκιμές στη συσκευή.

Ρύθμιση Gradle

Για τη σύνδεση JUnit 5 σε ένα έργο Android, αρκεί η προσθήκη της εξάρτησης org.junit.jupiter:junit-jupiter στο build.gradle σε επίπεδο αρθρώματος. Το AGP Gradle plugin υποστηρίζει την εκτέλεση δοκιμών JUnit 5 στο JVM μέσω του τυπικού Test Runner.

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

Δοκιμή ViewModel με JUnit

Στην πράξη, το JUnit χρησιμοποιείται συχνότερα για τη δοκιμή ViewModel και αποθηκών — επιπέδων που δεν απαιτούν περιβάλλον Android ή εμπλαιστωτή. Μια τέτοια δοκιμή εκτελείται σε χιλιοστά δευτερολέπτου και μπορεί να εκτελεστεί εκατοντάδες φορές χωρίς απώλεια χρόνου.

  • ViewModel — έλεγχος καταστάσεων: loading, success, error.
  • Repository — έλεγχος απεικόνισης δεδομένων και διαχείρισης σφαλμάτων.
  • UseCase — έλεγχος επιχειρηματικής λογικής με mocks εξαρτήσεων.

JUnit 4 vs JUnit 5: βασικές διαφορές

Το JUnit 5 (Jupiter) δεν είναι απλώς μια νέα έκδοση, αλλά μια πλήρως επανασχεδιασμένη πλατφόρμα χωρισμένη σε τρία αρθρώματα: JUnit Platform (εκτέλεση δοκιμών στο JVM), JUnit Jupiter (API για σύνταξη δοκιμών) και JUnit Vintage (προς τα πίσω συμβατότητα με JUnit 4). Αυτή η αρθρωματικότητα επιτρέπει τη σύνδεση διαφορετικών Test Engine — για παράδειγμα, Spek για Kotlin ή TestNG.

ΧαρακτηριστικόJUnit 4JUnit 5
Πακέτοorg.junitorg.junit.jupiter
Βασική annotation@Test (από junit.framework)@Test (από org.junit.jupiter.api)
Before/After@Before, @After, @BeforeClass@BeforeEach, @AfterEach, @BeforeAll
Parameterized@RunWith(Parameterized.class)@ParameterizedTest + @ValueSource
Extension@Rule, @ClassRule@ExtendWith, πιο ευέλικτο API
Java minJava 5Java 8+

Η μετανάστευση από JUnit 4 σε JUnit 5 δεν απαιτεί την επαναγραφή όλων των δοκιμών — αρκεί η σύνδεση του JUnit Vintage Engine, και οι παλιές δοκιμές θα συνεχίσουν να λειτουργούν. Οι νέες δοκιμές συνιστάται να γράφονται σε JUnit 5 για να αξιοποιηθούν οι επεκτάσεις, τα lambdas στις assertions και η ενσωματωμένη υποστήριξη για παραμετροποίηση.

Συχνές ερωτήσεις

Σε τι διαφέρει το JUnit από το Mockito;

Το JUnit είναι ένα framework για τη σύνταξη και εκτέλεση δοκιμών, ενώ το Mockito είναι μια βιβλιοθήκη για τη δημιουργία mock αντικειμένων. Χρησιμοποιούνται μαζί: το JUnit διαχειρίζεται την εκτέλεση της δοκιμής, και το Mockito αντικαθιστά τις εξαρτήσεις της κλάσης που δοκιμάζεται.

Μπορεί το JUnit 5 να χρησιμοποιηθεί σε έργα Android;

Ναι, το JUnit 5 είναι πλήρως συμβατό με τα έργα Android. Για τις αρθρωματικές δοκιμές, αρκεί η προσθήκη της εξάρτησης junit-jupiter στο build.gradle. Οι εργαλειακές δοκιμές εξακολουθούν να λειτουργούν μέσω AndroidX Test Runner.

Ποιο είναι το ελάχιστο σύνολο annotations που χρειάζεται για μια δοκιμή;

Το ελάχιστο, μια απλή annotation @Test πριν από τη μέθοδο είναι αρκετή. Για αρχικοποίηση και καθαρισμό, συνιστώνται τα @BeforeEach και @AfterEach, αλλά δεν είναι υποχρεωτικά.

Τι είναι το Test Runner στο JUnit;

Το Test Runner είναι το συστατικό του JUnit που σαρώνει το classpath, βρίσκει μεθόδους με την annotation @Test, δημιουργεί στοιχεία κλάσεων δοκιμής και εκτελεί τις δοκιμές. Στο JUnit 5, αυτόν τον ρόλο επιτελεί η JUnit Platform με συνδεδεμένα Test Engines.

Πώς να ελέγξω αν μια μέθοδος πετάει εξαίρεση;

Χρησιμοποιήστε assertThrows(Class, Executable) — δέχεται τον τύπο της αναμενόμενης εξαίρεσης και ένα lambda με την κλήση της μεθόδου. Το JUnit ελέγχει αν η εξαίρεση πραγματικά πετάχτηκε και την επιστρέφει για περαιτέρω ελεγχο.

Συμπεράσματα

  • JUnit — τυπικό framework αρθρωματικών δοκιμών για Java και Kotlin, βάση του οικοσυστήματος xUnit.
  • Annotations @Test, @BeforeEach, @AfterEach διαχειρίζονται τον κύκλο ζωής της κλάσης δοκιμής.
  • Assertions — assertEquals, assertTrue, assertThrows ελέγχουν την ορθότητα των αποτελεσμάτων.
  • Παραμετροποιημένες δοκιμές με @CsvSource και @MethodSource μειώνουν την επανάληψη κώδικα.
  • JUnit 5 — αρθρωματική αρχιτεκτονική με πλατφόρμα, Jupiter API και υποστήριξη επεκτάσεων.
  • Ενσωμάτωση Android — το JUnit λειτουργεί στο JVM μέσω του τυπικού Test Runner χωρίς εμπλαιστωτή.
  • Test Runner εντοπίζει και εκτελεί αυτόματα τις μεθόδους @Test, αναφέροντας τα αποτελέσματα.

Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση

Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης