我需要使用junit和一个模拟框架(如mockito)为下面的代码编写测试用例,这是一个命令行实用程序。
public class Line {
private final Header header;
int readLines()
{
Console con = System.console();
String message;
ArrayList<MEnum> mList = new ArrayList<>();
boolean exit = false;
while (!exit) {
message = "";
System.out.println("Please enter Key");
mList.clear();
return 0;
}
}
是否可以为CLI实用程序编写测试用例?
答案 0 :(得分:1)
另一个答案提供了很好的提示,但缺少一个关键点:您可以改进设计,使您的生产代码更容易测试。
你的问题是你在这里混淆了责任:readLines()应该有“核心”功能;然后,需要提供命令行界面。你把所有这些都推到一个方法中;这使得很难来测试该方法。
相反;您可以将方法更改为:
void processLines(List<String> keys, List<String> modules) {
...
含义:您可以直接向该方法提供该输入,而不是向方法的用户内部请求输入。现在您不需要模拟控制台或其他任何东西。你有一个接收两个列表的方法;当使用依赖注入时;您可以轻松验证通信/标头对象是否看到了您期望的呼叫;取决于您的测试为该方法提供的输入。
然后;当所有这些都有效时,你可以编写一个小帮助类,如:
public static void main....
List<String> keys = new ArrayList<>();
... loop code asking user for his input ...
someLine.processLines(keys, modules);
即使这可以进行单元测试;但如果你真的保持这么简单的水平;你可能不需要那个 - 因为你可以直接在命令上调用它。
长话短说:当你感觉你的生产代码难以测试时,那是因为首先是“糟糕的设计”。当代码难以测试时,也很难修复,增强或重用。您的方法仅适用于提供输入的用户的上下文。我的版本也可以直接用于其他场景。如上所述:测试会容易得多。
答案 1 :(得分:0)
请参阅Vogella教程,并详细解释使用Mockito进行单元测试的基本知识
在高级别,你需要:
创建Line
class
为Communcation
,Header
类等字段创建模拟
Line
类readLines
方法为这些值生成的方法