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
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](lib/utils/displayImage.php?id=tida&d=40-unit-tests&f=class.Player.png)
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.
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);
}
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"));
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;
}
}
}