java 函数中扫描输入的写入测试

yc0p9oo0  于 2022-10-30  发布在  Java
关注(0)|答案(1)|浏览(155)

这是我的代码,我不能在第二个函数中编写扫描输入的测试。第一个函数是用于单独的单词,它们包含+或-或““。第二个函数是用于分类查询,例如,你给予“妈妈爸爸+姐姐+西西-哥哥-兄弟”,然后用““拆分单词,然后调用第一个函数。

package Phase2;
import Phase2.QueryKeeper;

import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

public class QueryCategorizer {

    private final QueryKeeper queryKeeper = new QueryKeeper();

    private void separateBySign(String[] query) {
        Set<String> plusContain = new HashSet<>();
        Set<String> minusContain = new HashSet<>();
        Set<String> withoutContain = new HashSet<>();

        for (String queryIterator : query) {
            if (queryIterator.contains("+")) {
                plusContain.add(queryIterator.substring(1));
            } else if (queryIterator.contains("-")) {
                minusContain.add(queryIterator.substring(1));
            } else {
                withoutContain.add(queryIterator);
            }
        }
        queryKeeper.addAllSets(plusContain,minusContain,withoutContain);

    }

    public void categorizeQuery() {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Please enter a query");
        String query = scanner.nextLine();
        separateBySign(query.split(" "));
    }

    public QueryKeeper getQueryKeeper() {
        return queryKeeper;
    }

}
yvfmudvl

yvfmudvl1#

您的问题是由代码结构中的设计缺陷造成的。
categorizeQuery()混合了多个不同的任务:

  • 从用户获得原始输入(scanner.nextLine()),
  • 将输入解析成程序可用的形式(拆分成数组),
  • 处理搜索字(通过调用separateBySign())。

(The这同样适用于separateBySign()。)
这样的方法不仅难以进行单元测试,而且从长远来看也难以维护。
改变你的程序结构,让所有的步骤都返回一个结果,用一个顶级的方法一个接一个地调用所有的步骤,把上一个步骤的结果作为参数传递给下一个步骤。这样就很容易对每个步骤进行单元测试。如果你给它传递一些给定的参数,你就知道这个方法返回的是什么。如果一个测试失败了,你就确切地知道是哪个处理步骤负责的。
然后,嘲弄System.in并不容易的事实逐渐消失。使用System.in剩下的唯一步骤是读取原始文本行的方法,如果这个单行程序没有通过单元测试,也没关系-它在JRE发布过程中已经过了很好的测试。

相关问题