You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求协助为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:29:03