有一个pin验证检查类
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 次。告诉我如何实现它?
如果pin码是从标准输入流中读取的,想测试3次输入错误密码,然后抛出异常
AccountIsLockedException
,模拟输入3次错误密码,形成一个基于输入流的输入流就足够了形式的字符串"8888\n6666\n1234"
:但是,需要注意的是,所提出的验证方法并不是以最好的方式编写的,特别是违反了单一责任原则和弱逻辑,因为
true
,要么抛出异常,即返回布尔值没有意义