Java 使用jUnit测试每个开关/案例

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() {

我试图用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() {
        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/