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

标签 java

我有这个 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/

相关文章:

java - 特殊字符被 tomcat cookie 解析器拒绝

java - 包 sun.awt 不存在

java - 如何在 Java 的泛型(Erasure)中检索类型信息?

java - NoClassDefFoundError : org/apache/commons/lang/StringUtils

java - 从文件读取时出现 NullPointerException

java - 显式锁和条件变量 Java 生产者消费者

java - php 中的 AES/CBC/PKCS5Padding java 等价物是什么?

java - 如何将(代码生成的)TableRow 的内容与字符串进行比较?

java - JAVA/Android中从字符串中提取多个子字符串

java - + 运算符在 Java 中如何工作?