请求协助为readInput方法编写JUnit测试用例
没问题,我来帮你梳理下怎么给这个readInput方法写JUnit测试用例~首先得先把这个方法的核心逻辑摸清楚:它会遍历Scanner输入的每个字符串,检查字符串末尾是不是标点符号,如果是,就把字符串拆成单词部分和标点部分,各自生成Token对象加到tokens列表里;如果不是的话,应该直接把整个字符串作为Token加进去(看你代码没写完,但核心逻辑应该是这样)。
下面分几个关键测试场景来写具体的用例:
测试场景与代码实现
1. 输入纯无标点单词
验证方法能直接把纯单词作为单个Token加入列表:
@Test void testReadInputWithPlainWords() { // 构造测试输入 Scanner testScanner = new Scanner("hello world java"); YourTokenizerClass tokenizer = new YourTokenizerClass(); // 替换成你的实际类名 // 调用要测试的方法 tokenizer.readInput(testScanner); // 验证结果:应该有3个Token,对应三个单词 List<Token> resultTokens = tokenizer.getTokens(); // 假设类里有获取tokens的getter方法 assertEquals(3, resultTokens.size()); assertEquals("hello", resultTokens.get(0).getContent()); // 假设Token类有获取内容的方法,比如getContent() assertEquals("world", resultTokens.get(1).getContent()); assertEquals("java", resultTokens.get(2).getContent()); }
2. 单词末尾带单个标点的核心场景
这是方法的核心处理逻辑,要确保单词和标点被拆成两个独立的Token:
@Test void testReadInputWithWordEndingWithPunctuation() { Scanner testScanner = new Scanner("hello! world? foo,"); YourTokenizerClass tokenizer = new YourTokenizerClass(); tokenizer.readInput(testScanner); List<Token> resultTokens = tokenizer.getTokens(); // 三个单词+三个标点,总共6个Token assertEquals(6, resultTokens.size()); // 验证第一组 assertEquals("hello", resultTokens.get(0).getContent()); assertEquals("!", resultTokens.get(1).getContent()); // 验证第二组 assertEquals("world", resultTokens.get(2).getContent()); assertEquals("?", resultTokens.get(3).getContent()); // 验证第三组 assertEquals("foo", resultTokens.get(4).getContent()); assertEquals(",", resultTokens.get(5).getContent()); }
3. 单独输入标点符号的情况
验证单独的标点能被正确识别为单个Token:
@Test void testReadInputWithStandalonePunctuation() { Scanner testScanner = new Scanner("hello ! ; world ..."); YourTokenizerClass tokenizer = new YourTokenizerClass(); tokenizer.readInput(testScanner); List<Token> resultTokens = tokenizer.getTokens(); // 单词hello + 三个单独标点 + 单词world + 省略号,总共6个Token assertEquals(6, resultTokens.size()); assertEquals("hello", resultTokens.get(0).getContent()); assertEquals("!", resultTokens.get(1).getContent()); assertEquals(";", resultTokens.get(2).getContent()); assertEquals("world", resultTokens.get(3).getContent()); assertEquals("...", resultTokens.get(4).getContent()); }
4. 空输入的边界情况
验证当Scanner没有任何输入时,tokens列表保持为空:
@Test void testReadInputWithEmptyInput() { Scanner testScanner = new Scanner(""); YourTokenizerClass tokenizer = new YourTokenizerClass(); tokenizer.readInput(testScanner); List<Token> resultTokens = tokenizer.getTokens(); assertTrue(resultTokens.isEmpty()); }
5. 包含非英文标点的情况
验证方法的正则表达式能识别中文、特殊语言的标点:
@Test void testReadInputWithNonEnglishPunctuation() { Scanner testScanner = new Scanner("你好! こんにちは。 hello…"); YourTokenizerClass tokenizer = new YourTokenizerClass(); tokenizer.readInput(testScanner); List<Token> resultTokens = tokenizer.getTokens(); // 三个单词+三个标点,总共6个Token assertEquals(6, resultTokens.size()); assertEquals("你好", resultTokens.get(0).getContent()); assertEquals("!", resultTokens.get(1).getContent()); assertEquals("こんにちは", resultTokens.get(2).getContent()); assertEquals("。", resultTokens.get(3).getContent()); assertEquals("hello", resultTokens.get(4).getContent()); assertEquals("…", resultTokens.get(5).getContent()); }
几个注意点:
- 确保你的
Token类有合适的构造方法,以及能获取内容的公共方法(比如getContent()),这样测试里才能验证Token的内容。 - 如果
tokens是类的私有成员,建议给类添加一个getTokens()方法来供测试访问,这比用反射更优雅,也能保持代码的可测试性。 - 原代码里的正则表达式
[\\p{Punct}\\p{IsPunctuation}]已经覆盖了大部分标点类型,如果有特殊标点需要调整正则,记得对应补充测试用例。
内容的提问来源于stack exchange,提问作者Daniel Payne
相关产品推荐
相关产品推荐

