2024-06-16 13:08:55
  • Hello!
  • Whats ya doin?
  • ByeBye

[&]

3.147.69.50

Przykład. Tworzenie postaci gracza

workshop: #41-junit.html

Testy jednostkowe. JUnit

Warsztat: Testy tworzenia postaci - przykładowa klasa

Przygotowanie

  1. Utwórz Projekt w IDE i nazwij go np. 41-junit
  2. Stwórz szkielet klasy autoryzacyjnej zgodnej z załączonym diagramem UML
  3. Jednocześnie implementując klasę AuthBasic wykonaj dokumentację kodu stosując standard DocBlock
1 Title-1

Klasa gracza pozwalać będzie na utworzenie profilu gracza wskazując jego Nazwę, wybierając klasę, przypisując go do Gildii oraz konfigurując konkretne parametry postaci.

CLD: Player

Po implementacji szkieletu klasy AuthBasic należy przejść do przygotowywania (pliku/klasy) testu jednostkowego.

Zakładana struktura katalogów:

/ 41-junit
 |-- src/
 |  |-- Main.java
 |  \-- Player.java
 \-- test/
    \-- PlayerTest.java

Narzędzie JUnit wywoływane przyciskiem z poziomu widoku klasy PlayerTest.java wybierając przycisk na wysokości klasy lub pojedynczej metody.

2 Przykładowy test

Testowana metoda: pickClass() do wybrania klasy postaci poprzez wskazanie tej klasy jako String.

Adnotacja oznaczająca, że poniższa metoda jest TESTEM

// TO jest @adnotacja do umieszczenia przed metodą
@org.junit.jupiter.api.Test

Kod testu w metodzie testu:

// TUTAJ koniecznie @adnotacja
void letsPickClass() {
	// niezapomnij o instancji klasy Player (zmienna p)
	boolean out = p.pickClass("Warior");
	boolean exp = true;
	Assertions.assertEquals(exp,out);
}

Kiedy potrzeba użyć instancji klasy w kilku testach. Należy zadeklarować zmienną dla instancji o określonym typie tej klasy:

Player p;	// zmienna p jest zmienną instancji klasy Player
@BeforeEach
void setUp() {
	p = new Player();
}
@AfterEach
void tearDown() {
	p = null;
}

Poprawienie (uszczegółowienie) kodu testu w metodzie testu. Test pozwala stwierdzić, że przy wyborze nieistniejącej klasy metoda zwróci błąd, czego się spodziewamy.

@org.junit.jupiter.api.Test
void letsPickClass() {
	boolean out1 = p.pickClass("NPC");
	boolean exp1 = false;
	boolean out2 = p.pickClass("Warior");
	boolean exp2 = true;
	Assertions.assertEquals(exp1,out1);
	Assertions.assertEquals(exp2,out2);
}
3 Testowanie metod prywatnych w Java

Należy zaimplementować specjalną metodę używającą tzw. Reflection

Implementacja, inaczej niż w PHP, wymaga podania metody na stałe!

// nazwa wywoływanej metody, np. invokeMethod, ale należy pamiętać, że TA nazwa powinna pokrywać nazwę testowanej funkcji
    private Method invokeMethod() throws NoSuchMethodException {
// należy na stałe podać nazwę testowanej metody, ponieważ nie ma możliwości przekazania jej nazwy tak jak w PHP
    String methodName = "detectForbiddenNames";
// instancja testowanej klasy (tutaj Player) również należy podać na stałe
// zapis `String.class` oznacza przekazywanie parametrów do testowanej metody, TYP danych należy dostosować, np. Integer
    Method mtd = Player.class.getDeclaredMethod(methodName,String.class);
    mtd.setAccessible(true);
    return mtd;
}

Wywołanie w teście metody prywatnej:

assertEquals(false,invokeMethod().invoke(instancjaKlasy,"argument1"));
4 Implementacja klasy Player
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Player {

    private String name;
    private String pclass = "";
    private String guild = "";
    private List guilds = new ArrayList<>(Arrays.asList("Alfa","Beta","Ceta"));;
    private Integer strength = 0;
    private Integer speed = 0;
    private Integer stamina = 0;
    private Integer creativity = 0;

    public void setName(String value){
        if(this.detectForbiddenNames(value))
            this.name = value;
    }
    public String getName(){
        return this.name;
    }
    private boolean detectForbiddenNames(String name){
        List cenzura = new ArrayList<>(Arrays.asList("głupi","dupa","Twoja stara"));
        if(cenzura.contains(name)) {
            return false;
        } else {
            return true;
        }
    }
    public boolean pickClass(String pick){
        List classes = new ArrayList<>(Arrays.asList("Priest","Thief","Warior"));
        if(classes.contains(pick)) {
            this.pclass = pick;
            return true;
        } else {
            return false;
        }
    }
    public String getPClass(){
        return this.pclass;
    }
    public void joinGuild(String name){
        if(guilds.contains(name)) {
            this.guild = name;
        } else {
            guilds.add(name);
            this.guild = name;
        }
    }
    public String getGuild(){
        return this.guild;
    }
    public boolean guildLookup(String name){
        if(guilds.contains(name)) {
            return true;
        } else {
            return false;
        }
    }
}

Podsumowanie

  1. None or Empty