如何为Phone对象模拟对象。
波纹管
public class Fortest {
UserDao userdao = new UserDao();
Phone name = new Phone();
public String handleUser(User user) {
String returncode="failed";
//User usr = new User("bob");
String username=user.getUsername();
String pass=user.getPass();
System.out.println("username and password : "+username+" : "+pass);
Phone name = new Phone();
String ph = name.getA();
System.out.println("ph "+ph);
if(ph.equalsIgnoreCase("test")){
System.out.println("A "+ph);
returncode="done";
}
System.out.println("returning "+returncode);
return returncode;
//System.out.println("name "+name.toString());
//System.out.println(name.getA());
}
}
谢谢
首先,我要做一些假设。
user.getUsername()
与user.getPass()
无副作用的影响。该System.out.println
是对你并不重要。
这样,您的课程就变成了:
public class Fortest {
Phone name = new Phone();
public String handleUser(User user) {
String ph = name.getA();
if(ph.equalsIgnoreCase("test")){
return "done";
}
return "failed";
}
}
因此,您的测试有两个条件。要么phone.getA()
是“测试”,然后返回“完成”,要么不是,然后返回“失败”。
那么如何设置设置为“
getA
”。可以肯定的是,我们需要能够从测试中设置“名称”。为此,我们需要“注入”它(我们可以通过其他多种方式来实现它,但是我喜欢注入)。我会用Guice,许多人会用Spring。有些人会使用其他注入框架之一。但是在测试中,我们大多数人会使用手动注射。
public class Fortest {
Phone name;
Fortest(Phone name) {
this.name = name;
}
public String handleUser(User user) {
String ph = name.getA();
if(ph.equalsIgnoreCase("test")){
return "done";
}
return "failed";
}
}
public class TestFortest {
@Before
public void before() {
name = ; //...
subject = new Fortest(name);
}
}
现在测试非常简单:
public void whenTestModeIsEnabledThenReturnDone() {
setPhoneIntoTestMode();
String actual = subject.handleUser(null);
assertEquals(actual, "done");
}
public void whenTestModeIsDisabledThenReturnFailed() {
setPhoneIntoLiveMode();
String actual = subject.handleUser(null);
assertEquals(actual, "failed");
}
setPhoneIntoTestMode
/
的实现setPhoneIntoLiveMode
取决于复杂Phone
程度。如果它比我们要复杂的话,我们会以某种方式(模拟,存根等)看待它。这可能是您编写的代码块,也可能使用了Mocketo之类的工具。
如果Phone对象很简单,并且具有或可以具有“ setA
”方法,则只需使用该方法。
我相信以后你将需要userdao
。届时将做同样的事情。注入并模拟/设置对象。
我能得到第二个和第三个条件的承保范围,但不能得到最后一个和第一个条件的承保范围。 下面这个是我的测试函数
我有一个项目结构: 我用mvn clean:install构建了它,并创建了jar文件。现在,我想使用命令行运行QbsApplicationTests。为此,我在一个目录中放入了两个罐子: 并执行以下命令: 然而,我不断得到以下错误 问题: 我应该如何从控制台运行QbsApplicationTests测试 编辑我还尝试添加以下内容: 到主类,但Intellij一直说无法解析。
我一直在设置一些合约JUnit 4测试(遵循回答这个问题的建议) - 例如,如果我有一个接口(我已经在示例中包含了泛型,因为我在我的项目中使用它们) - 但是,这是一个大大简化的示例: 我可以创建一个抽象的合同测试,例如: ...并为每个实现扩展此抽象测试类(我使用。我还将一些变量传递给抽象测试类,以测试接口的实现。 然而,实际上,一些接口返回的对象是其他接口的实现,我希望能够使用该接口的抽象契约
我找到了关于如何从Java中启动JUnit 4测试用例的说明,但是还没有找到在JUnit 5测试用例上启动测试的结构。 我尝试的JUnit 4解决方案是这样的:如何从我的java应用程序内部运行JUnit测试? 我一直在尝试让JUnit5中的控制台启动器工作,但它会引发异常。这记录在这里:http://junit.org/junit5/docs/current/user-guide/#runnin