TestNG java валидация пин-кода
Есть класс проверки валидации пин-кода
public class PinValidator {
private final String pin;
private final LocalDateTime dateTime;
private final User user;
public PinValidator(String pin, LocalDateTime dateTime, User user) {
this.pin = pin;
this.dateTime = dateTime;
this.user = user;
}
public String getPin() {
return pin;
}
public LocalDateTime getDateTime() {
return dateTime;
}
public User getUser() {
return user;
}
public boolean verificationPinCode() throws AccountIsLockedException {
int count = 3;
boolean isExit;
System.out.println("Введите пин-код:");
Scanner scanner = new Scanner(System.in);
while (!pin.equals(scanner.nextLine())) {
count--;
if (count == 0) {
throw new AccountIsLockedException("Аккаунт " + user.getNumberAccount() + " заблокирован до " +
(dateTime.plusSeconds(5).format(DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss"))));
}
System.out.println("Неверный пин-код, попробуйте снова");
}
isExit = true;
System.out.println("Доброго времени суток, " + user.getFirstName() + "!");
return isExit;
}
}
Необходимо написать тест на проверку исключения. У меня тут организован ввод с клавиатуры в цикле. Читал, что можно сделать подмену типа такой
@Test(expectedExceptions = AccountIsLockedException.class)
public void pinValidatorShouldThrowAccountIsLockedException() {
ByteArrayInputStream in = new ByteArrayInputStream("8888".getBytes());
InputStream inputStream = System.in;
System.setIn(in);
pinValidator.verificationPinCode();
}
Но при запуске он у меня проверяет один раз и кидает ошибку, потому что это необходимо выполнить 3 раза. Подскажите как это реализовать?
Ответы (1 шт):
Если пин-код считывается из стандартного потока ввода, и требуется протестировать три попытки ввода неверного пароля с последующим выбрасыванием исключения AccountIsLockedException, для имитации ввода трёх неправильных паролей достаточно сформировать входной поток на основе строки вида "8888\n6666\n1234":
ByteArrayInputStream in = new ByteArrayInputStream("8888\n6666\n1234".getBytes()); // три строки с неправильными паролями
Однако следует отметить, что представленный метод валидации написан далеко не лучшим образом, в частности, с нарушением принципа единой ответственности и слабой логикой, так как здесь выполняются
- вывод сообщений с приветствиями в случае успеха,
- ввод пин-кода из стандартного потока (излишняя зависимость от способа ввода) с зацикливанием пока не будет введён правильный пин,
- допустимое количество попыток ввода и период блокирования не конфигурируются, а жёстко закодированы внутри метода,
- никак не проверяется период блокирования между последовательными вызовами
- либо всегда возвращается
true, либо выбрасывается исключение, то есть возврат булевого значения не имеет смысла - не проверяется формат пин-кода