Testovací framework TestNG umožňuje testovat nejen to, že metoda vrací výjimku a zároveň typ (třídu) vracené výjimky, ale též umožňuje otestovat zprávu, kterou tato výjimka obsahuje. To je vhodné například u vlastní výjimky, která vrací nějaký chybový kód. Otestujeme tedy nejen, že metoda v určitých případech vyhazuje chybu, ale také, zda vrací správný chybový kód.
Enum obsahující chybové kódy
public enum ErrorCode {
X_IS_TO_BIG("X1111"),
Y_IS_TO_BIG("Y1122"),
Y_IS_BIGGER_THAN_X("Y1133");
private final String code;
private ErrorCode(String code) {
this.code = code;
}
public String getCode() {
return this.code;
}
}
Třída představující naši chybu (exception)
public class MyException extends RuntimeException {
public MyException(String errorCode) {
super(errorCode);
}
}
Třída, jejíž metodu budeme testovat
public class MyObject {
private static final int X_MAX_VALUE = 100;
private static final int Y_MAX_VALUE = 50;
public int count(int x, int y) {
if (x > X_MAX_VALUE) {
throw new MyException(ErrorCode.X_IS_TO_BIG.getCode());
}
if (y >= Y_MAX_VALUE) {
throw new MyException(ErrorCode.Y_IS_TO_BIG.getCode());
}
if (y > x) {
throw new MyException(ErrorCode.Y_IS_BIGGER_THAN_X.getCode());
}
return (x + y) / (x + y);
}
}
Budeme testovat, zda metoda správně vrací výsledek (public void countOk()) a zda vyhazuje chybu se správných kódem v případě, že zadané číslo x nebo y je příliš velké (public void countXToBig(), public void countYToBig()), nebo když je y větší než x (public void countYBiggerThanX()).
import org.testng.annotations.Test;
import static org.testng.Assert.assertEquals;
public class MyObjectTest {
@Test(expectedExceptions = {MyException.class}, expectedExceptionsMessageRegExp = ".*X111.*")
public void countXToBig() {
int result = new MyObject().count(10_000, 12);
}
@Test(expectedExceptions = {MyException.class}, expectedExceptionsMessageRegExp = "Y.*22")
public void countYToBig() {
int result = new MyObject().count(9, 5_000);
}
@Test(expectedExceptions = {MyException.class}, expectedExceptionsMessageRegExp = "Y1133")
public void countYBiggerThanX() {
int result = new MyObject().count(22, 27);
}
@Test()
public void countOk() {
int result = new MyObject().count(8, 5);
assertEquals(result, 1);
}
}