Java 使用jUnit测试每个开关/案例
我试图用jUnit测试每个开关/用例块,但我不确定如何使每个测试用例对应于不同的开关/用例 我目前在MenuTest.java中有以下代码:Java 使用jUnit测试每个开关/案例,java,unit-testing,Java,Unit Testing,我试图用jUnit测试每个开关/用例块,但我不确定如何使每个测试用例对应于不同的开关/用例 我目前在MenuTest.java中有以下代码: package com.cw.hospital.test; import org.junit.Test; import org.junit.Assert; import com.cw.hospital.Menu; public class MenuTest { Menu MainMenu; public MenuTest() {
package com.cw.hospital.test;
import org.junit.Test;
import org.junit.Assert;
import com.cw.hospital.Menu;
public class MenuTest {
Menu MainMenu;
public MenuTest() {
super();
MainMenu = new Menu();
}
@Test
public void Case1() {
}
@Test
public void Case2() {
}
@Test
public void Case3() {
}
}
我的菜单类(im测试类)有一个main()方法。在该方法中,我读取用户输入,然后切换该输入
如何将不同的输入从测试类发送到菜单 在setup方法中创建类的实例(用@Before注释),并将参数传递给main方法。这里的关键是您要测试的内容。如果你在测试中展示你的类,我可以用更多提示更新答案
编辑:如果你真的想单元测试你的主要方法,你必须模拟你的飞行类。如果Flight类中调用的方法返回了一些内容,那么您必须告诉mock框架相应地返回一些内容。如果您将I/O内容和输入消耗等内容分开,那么测试内容就更容易了。我的意思是说,在某个地方(可能在您的main中)有I/O内容,然后创建一个将输入作为参数(可能是字符串)的方法 然后,只需使用参数值从JUnit测试中调用consumption方法,这些参数值将强制执行switch语句中的路径。例如:
[in the class under test]
void methodName()
{
String theInput;
... perform I/O and populate "theInput"
consume(theInput);
}
void consume(final String input)
{
switch (someting based on input)
{
...
}
}
[in your junit]
@Test
testConditionOne()
{
consume("force condition one");
}
@Test
testConditionTwo()
{
consume("force condition two");
}
... etc.
模拟用户输入可以通过System.setIn()完成;您可以传递一个PipedInputStream,其中传递您想要测试的输入案例
public class MenuTest {
OutputStream stdIn;
InputStream stdOut;
Menu MainMenu;
public MenuTest() {
super();
PipedInputStream in = new PipedInputStream();
stdIn = new PipedOutputStream(in);
System.setIn(in);
PipedOutputStream out = new PipedInputStream();
stdOut = new PipedInputStream(out);
System.setOut(out);
MainMenu = new Menu();
}
//...
}
您需要使用一个单独的线程来传递输入,因为主方法将阻塞,直到它可以读取某些内容
可以做类似的事情来捕获System.out输出main()方法如何读取用户的输入?首先,我要向用户打印一个菜单。然后用户输入哪个菜单项(1、2、3、4…)。然后将该输入切换为switch()ed,并使用case“1”:例如,只调用一个Flight.listprocess()方法;。测试就是如果输出符合我的预期输出(我必须硬编码到测试方法中),其他情况需要用户进一步输入。例如,案例2要求用户输入新的飞行数据。那么您将如何获取输出?然后,我可以使用断言来对照一些测试数据检查输出。@Nick copy/pass和
s/in/out/
和s/out/in/