我有一个问题,我无法为此功能编写测试
I have a problem and I can't write a test for this fuctions
这是我的代码,我无法在第二个函数中编写扫描输入的测试。第一个函数用于包含 + 或 - 或 " " 的单独单词。第二个函数是分类查询,比如你给“爸爸妈妈+姐姐+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()
也一样。)
这样的方法不仅难以单元测试,而且难以长期维护运行。
改变你的程序结构,让你所有的步骤 return 都有一个结果,并让一个顶层方法一个接一个地调用所有步骤,将上一步的结果作为参数传递给下一个。然后很容易对各个步骤进行单元测试。如果你给它传递一些给定的参数,你就知道 return 的方法是什么。如果一个测试失败,您会确切地知道哪个处理步骤负责。
然后,嘲笑 System.in
并不容易的事实逐渐消失。使用 System.in
剩下的唯一步骤是从中读取原始文本行的方法,如果您的单元测试未对这一行进行测试,也没关系 - 它在 JRE 发布过程中得到了很好的测试。
这是我的代码,我无法在第二个函数中编写扫描输入的测试。第一个函数用于包含 + 或 - 或 " " 的单独单词。第二个函数是分类查询,比如你给“爸爸妈妈+姐姐+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()
也一样。)
这样的方法不仅难以单元测试,而且难以长期维护运行。
改变你的程序结构,让你所有的步骤 return 都有一个结果,并让一个顶层方法一个接一个地调用所有步骤,将上一步的结果作为参数传递给下一个。然后很容易对各个步骤进行单元测试。如果你给它传递一些给定的参数,你就知道 return 的方法是什么。如果一个测试失败,您会确切地知道哪个处理步骤负责。
然后,嘲笑 System.in
并不容易的事实逐渐消失。使用 System.in
剩下的唯一步骤是从中读取原始文本行的方法,如果您的单元测试未对这一行进行测试,也没关系 - 它在 JRE 发布过程中得到了很好的测试。