gpt4 book ai didi

java - 测试不带参数的递归函数

转载 作者:太空宇宙 更新时间:2023-11-04 09:48:25 25 4
gpt4 key购买 nike

我有这个 validator 方法来检查用户的输入是否正确。

它按预期工作,但我找不到测试 passPhoneNumber() 方法的解决方案

我正在考虑向 passPhoneNumber() 方法添加一个参数,但这会破坏代码。

public static boolean phoneNumberValidator(String phoneNumber) {
Pattern pattern = Pattern.compile(PHONE_NUMBER_PATTERN);
Matcher matcher = pattern.matcher(phoneNumber);

if(!matcher.matches()) {
System.out.print("Invalid phone number. ");
return false;

} else {
return true;
}
}

public static String passPhoneNumber() {
System.out.print("Enter phone number (format 111222333): ");
String phoneNumber = scanner.nextLine();

if(phoneNumberValidator(phoneNumber)) {
return phoneNumber;

} else {
return passPhoneNumber();
}
}

我的模式是:

private static final String PHONE_NUMBER_PATTERN = "^\\d{9}$";

只有 9 位数字,没有其他内容。

最佳答案

我使用 do-while 循环清理了您的方法:

public static String passPhoneNumber() {
String phoneNumber = "";
Scanner scanner = new Scanner(System.in);
do {
System.out.println("Enter phone number (format 111222333): ");
phoneNumber = scanner.nextLine();
} while(!phoneNumberValidator(phoneNumber));
scanner.close();
return phoneNumber;
}

然后您可以使用 JUnit 等测试框架将代码与测试解耦。
在 JUnit 中,您有一个如下所示的测试类:

public class PhoneNumberValidatorTest extends TestCase {

public void testValidator() {
assertTrue("Valid number 1", PhoneClass.phoneNumberValidator("123456789"));
assertTrue("Valid number 2", PhoneClass.phoneNumberValidator("000000000"));
assertFalse("Invalid input 1", PhoneClass.phoneNumberValidator("0"));
assertFalse("Invalid input 2", PhoneClass.phoneNumberValidator("abcdefghi"));
}

public void testPasser() {
// Test with a valid input
System.setIn(new ByteArrayInputStream("123456789".getBytes()));
assertEquals("123456789", PhoneClass.passPhoneNumber());

// Test with another valid input
System.setIn(new ByteArrayInputStream("000000000".getBytes()));
assertEquals("000000000", PhoneClass.passPhoneNumber());

// Test with 1 invalid inputs and then 1 valid input
System.setIn(new ByteArrayInputStream("0\n111222333".getBytes()));
assertEquals("111222333", PhoneClass.passPhoneNumber());

// Test with 2 invalid inputs and then 1 valid input
System.setIn(new ByteArrayInputStream("abcdefghi\n12346578\n122333444".getBytes()));
assertEquals("122333444", PhoneClass.passPhoneNumber());

// Reset to the original System.in
System.setIn(System.in);
}
}

testPasser() 方法使用 System.in 覆盖我们预先确定的输入。
由于 passPhoneNumber() 将循环直到收到有效的电话号码输入,因此我们始终只需要测试 assertEquals 中的最终有效号码。

我希望这是您正在寻找的解决方案。

关于java - 测试不带参数的递归函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55129102/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com