PrzedsprzedażAkademia AI w testach i jakości oprogramowania: 1 350 zł zamiast 1 750 zł netto do 30 listopada

Startuje przedsprzedaż Akademii AI w testach i jakości oprogramowania: 5 tygodni z Tomaszem Stelmachem, start 11 stycznia 2027. Wyjątkowa cena 1 350 zł netto zamiast 1 750 zł tylko do 30 listopada.

zostało 32 dniZobaczcie program i zapiszcie się
16. Funkcje
Czas czytania: 12 minut

Metoda w Javie to nazwany blok kodu zapisany wewnątrz klasy, który przyjmuje parametry, wykonuje jedno zadanie i może zwrócić wynik. W kursie nazywamy ją też funkcją, bo tak mówi się o tym w większości języków, ale w specyfikacji Javy pada wyłącznie słowo „metoda”. To szesnasta lekcja kursu Javy dla testerów: pokazujemy budowę metody, przekazywanie argumentów i przeciążanie na przykładach z automatyzacji testów, a cały kod skompilowaliśmy w Javie 25.

Według strony projektu OpenJDK JDK 25 osiągnął dostępność ogólną 16 września 2025 roku, a według mapy wsparcia Oracle to najnowsze wydanie z długim wsparciem, więc przykłady z tej lekcji posłużą Wam latami. Wcześniejsze lekcje, które przydadzą się tutaj, to klasy i obiekty w Javie oraz konstruktory w Javie, bo metody zawsze żyją w klasie.

Czym są metody w Javie i dlaczego w kursie mówimy o funkcjach?

W Javie nie ma funkcji, które istnieją samodzielnie, poza klasą. Każda metoda należy do jakiejś klasy albo interfejsu. Nie łamie tego nawet zwarty plik źródłowy z Javy 25 (JEP 512), w którym void main() i inne metody piszecie bez deklaracji klasy: klasę deklaruje za Was kompilator, o czym więcej w lekcji o pierwszym programie w Javie. Metoda statyczna, oznaczona słowem static, należy do klasy i wywołujecie ją nazwą klasy, na przykład Math.max(3, 7). Metoda instancyjna należy do obiektu i potrzebuje go do wywołania, na przykład driver.findElement(...) w Selenium.

Metody dzielą się też według pochodzenia. Metody z biblioteki standardowej, takie jak String.equals czy List.add, ktoś już napisał i przetestował. Metody własne piszecie sami, żeby nie powtarzać tego samego kodu w dziesięciu testach. Właśnie te drugie są tematem lekcji, bo to one decydują, czy Wasz framework testowy da się czytać po pół roku.

Z czego składa się deklaracja metody i co jest w niej obowiązkowe?

Według specyfikacji języka Java SE 25, rozdział 8.4, deklaracja metody składa się z nagłówka i ciała. Starsza wersja tej lekcji podawała modyfikator dostępu jako element obowiązkowy. To nieprawda: specyfikacja w rozdziale 6.6 mówi, że bez modyfikatora większość deklaracji ma dostęp pakietowy, czyli metoda jest widoczna dla wszystkich klas z tego samego pakietu. Samouczek Oracle nazywa ten poziom package-private.

Element Obowiązkowy? Przykład Uwagi
Modyfikator dostępu nie public, private, protected bez modyfikatora: dostęp pakietowy
Inne modyfikatory nie static, final static: metoda klasy, nie obiektu
Typ zwracany tak boolean, String, void void, gdy metoda nic nie zwraca
Nazwa tak czyKodSukcesu dowolny poprawny identyfikator; czasownik to konwencja
Lista parametrów w nawiasach nawiasy tak, parametry nie (int kod) albo () pusta lista to też lista
Ciało w klamrach tak, poza metodami abstrakcyjnymi { return kod >= 200; } metoda z typem innym niż void musi zwrócić wartość

Źródło: Oracle, The Java Language Specification SE 25, rozdziały 8.4 i 6.6; The Java Tutorials, Defining Methods.

BudowaMetody.java, Java 25

public class BudowaMetody {

    // modyfikator | static | typ zwracany | nazwa | lista parametrów
    public static boolean czyKodSukcesu(int kod) {
        return kod >= 200 && kod < 300;
    }

    // void: metoda nic nie zwraca, tylko wykonuje działanie
    static void wypiszWynik(String nazwaTestu, boolean zaliczony) {
        System.out.println(nazwaTestu + ": " + (zaliczony ? "PASSED" : "FAILED"));
    }

    // Metoda bezparametrowa, bez modyfikatora dostępu, czyli z dostępem pakietowym
    static String domyslnaPrzegladarka() {
        return "chrome";
    }

    public static void main(String[] args) {
        boolean wynik = czyKodSukcesu(201);
        wypiszWynik("rejestracja zwraca 201", wynik);
        wypiszWynik("strona błędu zwraca 2xx", czyKodSukcesu(404));
        System.out.println("Przeglądarka: " + domyslnaPrzegladarka());
    }
}

Wynik uruchomienia

rejestracja zwraca 201: PASSED
strona błędu zwraca 2xx: FAILED
Przeglądarka: chrome

Zwróćcie uwagę na metodę domyslnaPrzegladarka: nie ma modyfikatora dostępu i kompiluje się bez ostrzeżeń. Metoda czyKodSukcesu zwraca wartość, więc jej wynik możecie przypisać do zmiennej albo od razu przekazać dalej, jak w drugim wywołaniu wypiszWynik.

Jak nazywać metody, żeby test czytał się jak scenariusz?

Kompilator przyjmie każdą poprawną nazwę, także x1 albo zrobTo. Reguła o czasowniku to konwencja, nie wymóg języka, choć poprzednia wersja lekcji przedstawiała ją jako obowiązek. Samouczek Oracle opisuje ją tak: nazwa metody powinna być czasownikiem pisanym małą literą albo wieloma słowami zaczynającymi się od czasownika, a każde kolejne słowo zaczyna się wielką literą. To zapis nazywany camelCase. Konwencji warto się trzymać, bo w testach nazwy metod tworzą scenariusz, który czyta cały zespół.

Słabo Lepiej Dlaczego
login() zalogujJako(String rola) czasownik i informacja, kim się logujemy
check() czyKomunikatBleduWidoczny() metody zwracające boolean zaczynamy od czy, jest, ma (po angielsku is, has)
data() pobierzNumerZamowienia() wiadomo, co wraca
test1() krotkieHasloDajeKomunikatBledu() nazwa testu mówi, co sprawdza, bez otwierania kodu

Źródło: Oracle, The Java Tutorials, Defining Methods (konwencja nazewnicza); praktyka Quality Island.

Jak Java przekazuje argumenty do metody?

Java przekazuje argumenty zawsze przez wartość. Specyfikacja Javy SE 25 w rozdziale 8.4.1 opisuje to tak: przy wywołaniu wartości argumentów inicjalizują nowo utworzone zmienne parametrów. Przy typach prostych, jak int, metoda dostaje kopię liczby. Przy obiektach dostaje kopię referencji, czyli adresu tego samego obiektu. Stąd dwa zachowania, które zaskakują początkujących.

Przekazywanie.java, Java 25

import java.util.ArrayList;
import java.util.List;

public class Przekazywanie {

    static void zwieksz(int licznik) {
        licznik++; // zmienia tylko lokalną kopię
    }

    static void dodajBlad(List<String> bledy, String opis) {
        bledy.add(opis); // zmienia obiekt, na który wskazuje referencja
    }

    static void podmienListe(List<String> bledy) {
        bledy = new ArrayList<>(); // zmienia tylko lokalną kopię referencji
        bledy.add("nikt tego nie zobaczy");
    }

    public static void main(String[] args) {
        int licznik = 0;
        zwieksz(licznik);
        System.out.println("licznik = " + licznik); // 0

        List<String> bledy = new ArrayList<>();
        dodajBlad(bledy, "przycisk Zapisz nieaktywny");
        podmienListe(bledy);
        System.out.println("bledy = " + bledy); // [przycisk Zapisz nieaktywny]
    }
}

Wynik uruchomienia

licznik = 0
bledy = [przycisk Zapisz nieaktywny]

Dwie metody, dwa różne wyniki

Metoda dodajBlad zmieniła listę z main, a podmienListe nie, choć obie dostały tę samą referencję. Pierwsza zmienia obiekt, na który referencja wskazuje. Druga podmienia tylko swoją lokalną kopię referencji, więc lista z main nawet tego nie zauważy. Samouczek Oracle mówi wprost, że parametry typów referencyjnych także są przekazywane przez wartość. W testach to częste źródło błędu: metoda pomocnicza „czyści dane testowe”, przypisując nową listę, a stare dane spokojnie czekają na kolejny test.

Czym jest przeciążanie metod w Javie?

Przeciążanie metod (ang. overloading) to kilka metod o tej samej nazwie w jednej klasie, które różnią się listą parametrów: liczbą, typami albo kolejnością typów. Według specyfikacji Javy SE 25, rozdział 8.4.9, nazwa jest przeciążona, gdy dwie metody klasy mają tę samą nazwę, ale ich sygnatury nie są równoważne. Sygnatura to nazwa i typy parametrów. Typ zwracany do niej nie należy.

Przeciążanie metod w Javie: zmiana typów argumentów albo liczby argumentów
Dwa najczęstsze sposoby przeciążania: inne typy albo inna liczba parametrów. Trzeci to inna kolejność typów.

Najlepszy przykład z pracy testera to metoda logowania w Page Object. Raz logujecie się samym loginem i hasłem, raz z zaznaczonym polem „Zapamiętaj mnie”, a raz obiektem użytkownika z danych testowych. Zamiast trzech nazw zaloguj, zalogujZZapamietaniem i zalogujUzytkownika macie jedną, a krótsze wersje wywołują najpełniejszą, więc logika siedzi w jednym miejscu.

LoginPage.java, Java 25

public class LoginPage {

    private final StringBuilder dziennik = new StringBuilder();

    // Wersja podstawowa: login i hasło
    public LoginPage zaloguj(String login, String haslo) {
        return zaloguj(login, haslo, false);
    }

    // Przeciążenie: ta sama nazwa, inna liczba parametrów
    public LoginPage zaloguj(String login, String haslo, boolean zapamietaj) {
        dziennik.append("wpisuję ").append(login)
                .append(", hasło ").append("*".repeat(haslo.length()))
                .append(zapamietaj ? ", zaznaczam Zapamiętaj mnie" : "")
                .append(System.lineSeparator());
        return this;
    }

    // Przeciążenie: inny typ parametru
    public LoginPage zaloguj(Uzytkownik uzytkownik) {
        return zaloguj(uzytkownik.login(), uzytkownik.haslo(), false);
    }

    public String dziennik() {
        return dziennik.toString();
    }

    record Uzytkownik(String login, String haslo) { }

    public static void main(String[] args) {
        LoginPage strona = new LoginPage();
        strona.zaloguj("anna@example.com", "Haslo123!")
              .zaloguj("jan@example.com", "Tajne456!", true)
              .zaloguj(new Uzytkownik("admin@example.com", "Admin789!"));
        System.out.print(strona.dziennik());
    }
}

Wynik uruchomienia

wpisuję anna@example.com, hasło *********
wpisuję jan@example.com, hasło *********, zaznaczam Zapamiętaj mnie
wpisuję admin@example.com, hasło *********

W przykładzie metody zwracają this, dzięki czemu wywołania można łączyć w łańcuch. Klasa Uzytkownik to rekord, czyli zwięzła klasa na dane, dostępna na stałe od Javy 16 według JEP 395. Prawdziwa wersja tej klasy zamiast dopisywać tekst do dziennika wpisywałaby dane w pola strony przez Selenium, jak w lekcji o selektorach prostych.

Czego przeciążanie nie daje? Poprzednia wersja lekcji wymieniała wśród zalet „zwiększoną optymalizację kodu”. Przeciążanie nie przyspiesza programu: kompilator i tak wybiera jedną konkretną metodę przy kompilacji. Zyskujecie czytelność i spójne nazwy. Samouczek Oracle dodaje ostrzeżenie, że przeciążonych metod należy używać oszczędnie, bo w nadmiarze utrudniają czytanie kodu. I jeszcze jedno: dwóch metod różniących się tylko typem zwracanym nie da się zadeklarować.

ZlePrzeciazenie.java i komunikat javac

static int czasOdpowiedzi(String adres) { return 120; }
static long czasOdpowiedzi(String adres) { return 120L; }

ZlePrzeciazenie.java:3: error: method czasOdpowiedzi(String) is already defined in class ZlePrzeciazenie

Wolno

Inna liczba parametrów

zaloguj(login, haslo) i zaloguj(login, haslo, zapamietaj). Najczęstszy i najbezpieczniejszy sposób.

Wolno

Inne typy parametrów

zaloguj(String, String) i zaloguj(Uzytkownik). Kompilator rozróżni je po typie argumentu.

Nie wolno

Tylko inny typ zwracany

int i long przy tych samych parametrach: błąd kompilacji, metoda już zdefiniowana.

Jak kompilator wybiera jedną z przeciążonych metod?

Gdy kilka przeciążonych wersji pasuje do wywołania, kompilator wybiera według ustalonej kolejności. Specyfikacja Javy SE 25, rozdział 15.12.2, opisuje 3 fazy. W pierwszej szuka metody bez pakowania typów prostych w obiekty (boxing) i bez zmiennej liczby argumentów. W drugiej dopuszcza boxing. Dopiero w trzeciej bierze pod uwagę metody ze zmienną liczbą argumentów, zapisywane jako int.... W każdej fazie wygrywa wersja najbardziej szczegółowa.

Varargs.java, Java 25

public class Varargs {

    // Zmienna liczba argumentów: wewnątrz metody to zwykła tablica
    static int sumaCzasow(int... czasyMs) {
        int suma = 0;
        for (int czas : czasyMs) {
            suma += czas;
        }
        return suma;
    }

    static void loguj(String komunikat) {
        System.out.println("String: " + komunikat);
    }

    static void loguj(Object komunikat) {
        System.out.println("Object: " + komunikat);
    }

    public static void main(String[] args) {
        System.out.println(sumaCzasow(120, 340, 95)); // 555
        System.out.println(sumaCzasow());              // 0
        loguj("tekst");          // wybrana wersja String, najbardziej szczegółowa
        loguj(404);              // int zapakowany w Integer, wybrana wersja Object
        loguj((Object) "tekst"); // rzutowanie wymusza wersję Object
    }
}

Wynik uruchomienia

555
0
String: tekst
Object: 404
Object: tekst

Wywołanie loguj("tekst") pasuje do obu wersji, ale String jest bardziej szczegółowy niż Object, więc wygrywa. Wywołanie loguj(404) nie pasuje do String wcale, a do Object pasuje dopiero po zapakowaniu liczby w Integer, czyli w drugiej fazie. Kompilator rozstrzyga przeciążenia jak dobry sędzia: zawsze według tych samych przepisów, nawet jeśli żaden z zawodników nie przeczytał regulaminu.

Metody w liczbach

3

fazy wyboru przeciążonej metody w specyfikacji Javy SE 25, rozdział 15.12.2

4

poziomy dostępu: public, protected, pakietowy i private, według samouczka Oracle

2025

rok wydania Javy 25 z długim wsparciem, według OpenJDK; w niej skompilowaliśmy kod lekcji

16

wydanie Javy, w którym rekordy weszły na stałe, według JEP 395

Źródło: Oracle, Java Language Specification SE 25 i The Java Tutorials; OpenJDK, JEP 395.

Jak metody porządkują kod testów automatycznych?

Z naszego doświadczenia przy ponad 450 000 testów automatycznych napisanych przez zespół Quality Island najdroższy w utrzymaniu jest kod skopiowany do wielu testów: ten sam blok logowania, te same trzy linijki czekania na element. Gdy zmienia się strona, poprawiacie go w trzydziestu miejscach zamiast w jednym. Metoda z dobrą nazwą zamienia taki blok w jedną linijkę, a test zaczyna czytać się jak scenariusz: zaloguj, dodaj produkt do koszyka, sprawdź sumę.

Na tym pomyśle opiera się wzorzec Page Object, który dokumentacja Selenium opisuje jako obiekt reprezentujący stronę i udostępniający jej usługi przez publiczne metody. Szerzej o tym, jak metody i wzorce ratują duże zestawy testów przed chaosem, piszemy w artykule o wzorcach projektowych w Selenium WebDriver, a Strefa QA w tekście o tym, jak unikać testowego spaghetti w testach end to end. Metody przyjmujące tablicę danych testowych zobaczycie w lekcji o tablicach w Javie, a pętle, którymi je przetwarzacie, w lekcji pętle w Javie.

Jeśli wolicie przerobić metody, klasy i kolekcje z trenerem, służy do tego szkolenie wprowadzenie do programowania od podstaw w Javie, a dla osób, które piszą już proste programy, programowanie w Javie dla testerów oprogramowania. Kolejny krok to automatyzacja testów z Selenium WebDriver, gdzie każda klasa Page Object to w praktyce zestaw dobrze nazwanych metod. W Quality Island przeszkoliliśmy już ponad 2 500 specjalistów i przeciążanie metody logowania to ćwiczenie, które wraca w każdej grupie.

Co zabrać z tego artykułu

01Metoda to nazwany blok kodu w klasie. W Javie nie ma funkcji poza klasą, a słowo „funkcja” w kursie to potoczna nazwa metody.

02Obowiązkowe są typ zwracany (albo void), nazwa, nawiasy z listą parametrów i ciało. Modyfikator dostępu jest opcjonalny: bez niego metoda ma dostęp pakietowy.

03Czasownik i camelCase w nazwie to konwencja, nie wymóg kompilatora. W testach warto się jej trzymać, bo nazwy metod tworzą scenariusz.

04Java przekazuje argumenty przez wartość. Przy obiektach kopiowana jest referencja: zmiana obiektu jest widoczna na zewnątrz, podmiana referencji nie.

05Przeciążanie to ta sama nazwa i inna lista parametrów. Typ zwracany nie wystarczy, a samo przeciążanie nie przyspiesza programu, tylko porządkuje nazwy.

Źródło: Oracle, Java Language Specification SE 25 (rozdziały 6.6, 8.4, 15.12.2); The Java Tutorials; kod skompilowany w Javie 25.

Chcecie, żeby Wasi testerzy pisali metody pomocnicze i Page Object, które da się utrzymać? Na szkoleniu przerobicie to na przykładach z automatyzacji, z trenerem praktykiem.

Zobacz szkolenie z Javy

Poprzednia lekcja15. KonstruktorySpis kursuWszystkie lekcje kursu JavyNastępna lekcja17. Hermetyzacja

Powiązane na blogu Quality Island

Pełna lista źródeł

Autor lekcji: Tomasz Stelmach.

Co o tym sądzisz?

Dodaj komentarz

Bądź na bieżąco
Strefa QA, portal z eksperckimi artykułami o jakości oprogramowania
Bądź na bieżąco
Cyberbezpieczeństwo KSC i NIS2 online: zarząd, pracownicy, zespoły IT i pakiety dla organizacji

od 199,00 zł netto

Kompetencje cyfrowe i AI dla pracowników 50+
Kompetencje cyfrowe i AI dla pracowników 50+: szkolenie praktyczne

1 000,00 zł

07.12.26, 18.01.27, 15.02.27, 15.03.27, 19.04.27
1 dzień
Europejski Akt o Dostępności w praktyce
Europejski Akt o Dostępności w praktyce: wymagania ustawy dla e-commerce, banków i usług cyfrowych

1 290,00 zł

01.12.26, 19.01.27, 16.02.27, 16.03.27, 20.04.27
1 dzień
Popularne artykuły
Język Gherkin: co to jest i jak go używać w testowaniu oprogramowania
Smoke test: co to jest, kiedy go uruchamiać i czym różni się od sanity testu
Jak zostać testerem oprogramowania: ścieżka krok po kroku bez dyplomu informatyka
Najnowsze artykuły
AI w testowaniu oprogramowania: szablon promptu, tabela decyzyjna i liczby z badań
Wdrożenie AI w zespole QA: plan 90 dni, koszt pilotażu i karta mierników
NIS2 a dostawcy oprogramowania: jakich testów zażąda od Was klient objęty KSC
Popularne kategorie

Grupa marek jakości oprogramowania

Jakość oprogramowania w Polsce ma swój adres

Quality Island