微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我有一个问题,我无法为此功能编写测试

如何解决我有一个问题,我无法为此功能编写测试

这是我的代码,我无法在第二个函数中编写扫描输入的测试。第一个函数用于包含 + 或 - 或“ ”的单独单词。第二个函数用于分类查询,比如你给“mom dad +sister +sisi -brother -bro”然后用“”分割单词,然后调用一个函数

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;
    }

}

解决方法

您的问题是代码结构设计缺陷的结果。

categorizeQuery() 混合多个不同的任务:

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

(同样适用于 separateBySign()。)

这样的方法不仅难以进行单元测试,而且从长远来看也难以维护。

改变你的程序结构,让你的所有步骤都返回一个结果,并让一个顶级方法逐一调用所有步骤,将上一步的结果作为参数传递给下一个步骤。然后很容易对各个步骤进行单元测试。如果您向它传递一些给定的参数,您就知道该方法将返回什么。如果一项测试失败,您就可以确切地知道哪个处理步骤是负责的。

然后,事实逐渐消失,嘲笑 System.in 并不容易。使用 System.in 剩下的唯一步骤是从中读取原始文本行的方法,如果您的单元测试未测试此单行,那没关系 - 它在 JRE 发布过程中得到了很好的测试。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。