Testy jednostkowe. JUnit Warsztat: Testy tworzenia postaci - przykładowa klasa Przygotowanie Utwórz Projekt w IDE i nazwij go np. 41-junit Stwórz szkielet klasy autoryzacyjnej zgodnej z załączonym diagramem UML 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. 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; } } }