Commit 4f270606 by Patryk Czarnik

Dalsze testy - konto

parent ebc130fb
package konto;
public class BrakSrodkow extends Exception {
public BrakSrodkow() {
super();
}
public BrakSrodkow(String message) {
super(message);
}
}
package konto;
public class Konto {
private int numer;
private String wlasciciel;
private int saldo;
public Konto(int numer, String wlasciciel, int saldo) {
this.numer = numer;
this.wlasciciel = wlasciciel;
this.saldo = saldo;
}
public int getNumer() {
return numer;
}
public String getWlasciciel() {
return wlasciciel;
}
public int getSaldo() {
return saldo;
}
@Override
public String toString() {
return "Konto nr " + this.numer + ", saldo: " + this.saldo + ", wł.: " + this.wlasciciel;
}
public void wplata(int kwota) {
if(kwota <= 0) {
throw new IllegalArgumentException("Niedodatnia kwota w metodzie wplata");
}
this.saldo += kwota;
}
public void wyplata(int kwota) throws BrakSrodkow {
if(kwota <= 0) {
throw new IllegalArgumentException("Niedodatnia kwota w metodzie wyplata");
}
if(kwota > saldo) {
throw new BrakSrodkow("Brak środków na koncie nr " + numer);
}
this.saldo -= kwota;
}
}
package konto;
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
class KontoTest {
private Konto konto;
@BeforeEach
void setUp() {
// metoda wykona się bezpośrednio przed każdy testem
// istnieje też @AfterEach tearDown() - wykonuje się po każdym teście
// Zazwyczaj w setUp przygotowuje się wspólne dane potrzebne przed każdym testem, taki stan początkowy (w literaturze: "fixture").
konto = new Konto(1, "Ala", 1000);
}
@Test
void testKonstruktorIGettery() {
assertEquals(1, konto.getNumer());
assertEquals("Ala", konto.getWlasciciel());
assertEquals(1000, konto.getSaldo());
}
@Test
void testToString() {
String napis = konto.toString();
assertEquals("Konto nr 1, saldo: 1000, wł.: Ala", napis);
}
@Test
void testWplata() {
konto.wplata(400);
assertEquals(1400, konto.getSaldo());
}
@Test
void testWyplata() throws BrakSrodkow {
konto.wyplata(400);
assertEquals(600, konto.getSaldo());
}
// Temat sprawdzania wyjątków w testach.
// Aby stwierdzić, że w pewnej sytuacji metoda POWINNA skończyć się wyjątkiem,
// możemy użyć odpowiednio try-catch (testWplataTry)
// albo użyć dedykowanych rozwiązań JUnit - dalsze przykłady
@Test
void testWplataTry() {
try {
konto.wplata(-100);
// Gdyby nie było wyjątku i program doszedłby do tego miejsca,
// test powinien skończyć się porażką
fail("Powinien być wyjątek, a nie ma.");
} catch(IllegalArgumentException e) {
// Jeśli wyłapiemy wyjątek, możemy sprawdzić w teście jego szczegóły,
// np. jaki jest message (bardzo rzadko takie rzeczy sprawdza się w testach, ale można):
assertEquals("Niedodatnia kwota w metodzie wplata", e.getMessage());
} finally {
// Możemy też upewnić się, że w przypadku wystąpienia wyjątku stan konta się nie zmienił.
assertEquals(1000, konto.getSaldo());
}
}
// Analogiczny test można też napisać wykorzystując nową funkcjonalność JUnit 5:
@Test
void testWplataUjemna_v1() {
// assertThrows wykonuje podany fragment kodu (w praktyce podaje się wyrażenie lambda)
// i sprawdza czy ten kończy się podanym rodzajem wyjątku.
// Jeśli jest wyjątek - dobrze
// Jeśli nie ma wyjątku - test failuje
assertThrows(IllegalArgumentException.class, () -> {
konto.wplata(-100);
});
// Dodatkowo po wykonaniu assertThrows możemy sprawdzić jaki jest stan końcowy,
// np. czy saldo się nie zmieniło.
assertEquals(1000, konto.getSaldo());
}
// Aby sprawdzić jaki jest message w wyjątku itp, możemy odebrać obiekt wyjątku i sprawdzić bezpośrednio
@Test
void testWplataUjemna_v2() {
IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> {
konto.wplata(-100);
});
assertEquals("Niedodatnia kwota w metodzie wplata", exception.getMessage());
assertEquals(1000, konto.getSaldo());
}
@Test
void testWyplataUjemna() {
assertThrows(IllegalArgumentException.class, () -> {
konto.wyplata(-100);
});
assertEquals(1000, konto.getSaldo());
}
@Test
void testBrakSrodkow() {
assertThrows(BrakSrodkow.class, () -> {
konto.wyplata(1300);
});
assertEquals(1000, konto.getSaldo());
}
}
package konto;
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;
class KontoTest_v0 {
// W tej wersji nie używamy setUp, tylko na początku każdej metody z testem
// tworzymy przykładowe konto.
@Test
void testKonstruktorIGettery() {
Konto konto = new Konto(1, "Ala", 1000);
assertEquals(1, konto.getNumer());
assertEquals("Ala", konto.getWlasciciel());
assertEquals(1000, konto.getSaldo());
}
@Test
void testToString() {
Konto konto = new Konto(1, "Ala", 1000);
String napis = konto.toString();
assertEquals("Konto nr 1, saldo: 1000, wł.: Ala", napis);
}
@Test
void testWplata() {
Konto konto = new Konto(1, "Ala", 1000);
konto.wplata(400);
assertEquals(1400, konto.getSaldo());
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment