如何用Java编写测试验证社保号字符串仅含数字且长度合规?
Java社保号数字验证测试的正确写法
原代码的问题
- JUnit的
@Test测试方法不能带参数,必须是无参方法;如果要测试多组输入,得用参数化测试 - 正则表达式错误:
[a-zA-Z]+只能匹配纯字母,无法覆盖其他非数字字符(比如符号、空格),要匹配非数字应该用\\D+(等价于[^0-9]+) assertFalse()必须传入要断言的布尔值,否则编译不通过
修正后的单测试用例代码
import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; import org.junit.jupiter.api.Test; public class SocialSecurityNumberTest { // 测试含非数字的社保号验证失败 @Test void rejectNonDigitSSN() { String invalidSSN = "12345a7890"; // 调用你的社保号检查方法(假设方法名为isValidSSN) assertFalse(isValidSSN(invalidSSN, 10)); } // 测试纯数字社保号验证通过 @Test void acceptValidDigitSSN() { String validSSN = "1234567890"; assertTrue(isValidSSN(validSSN, 10)); } // 你的社保号检查实现方法 public static boolean isValidSSN(String ssn, int requiredLength) { if (ssn == null) { return false; } // 同时验证长度和全数字 return ssn.length() == requiredLength && ssn.matches("\\d+"); } }
多输入参数化测试写法(更高效)
如果要测试多组有效/无效用例,用@ParameterizedTest配合参数源:
import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; public class SocialSecurityNumberTest { // 测试多组含非数字的无效社保号 @ParameterizedTest @ValueSource(strings = {"123a567890", "abcdefghij", "123456789!", " 1234567890"}) void rejectAllNonDigitSSNs(String invalidSSN) { assertFalse(isValidSSN(invalidSSN, 10)); } // 测试多组纯数字的有效社保号 @ParameterizedTest @ValueSource(strings = {"0000000000", "1234567890", "9876543210"}) void acceptAllValidDigitSSNs(String validSSN) { assertTrue(isValidSSN(validSSN, 10)); } // 社保号检查方法 public static boolean isValidSSN(String ssn, int requiredLength) { if (ssn == null) { return false; } return ssn.length() == requiredLength && ssn.matches("\\d+"); } }
关键说明
\\d+是匹配纯数字字符串的正则,.*\\D.*可以匹配任何包含至少一个非数字的字符串- 测试核心是调用你的业务方法
isValidSSN,断言其返回值符合预期,而不是单独判断正则(业务逻辑应该封装在方法里,测试只验证方法结果) - 参数化测试需要确保引入了JUnit Jupiter参数化测试依赖(比如Maven的
junit-jupiter-params)
内容的提问来源于stack exchange,提问作者santa_cloudy
相关产品推荐
相关产品推荐

