使用jUnit测试每个开关/外壳

时间:2011-11-30 18:09:10

标签: java unit-testing

我正在尝试使用jUnit测试每个开关/案例块,但我不确定如何让每个TestCase对应不同的开关/案例。

我目前在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() {

    }


}

我的Menu类(类im测试)有一个main()方法。在该方法内部,我正在读取用户输入,然后切换该输入。

如何将Test类的不同输入发送到菜单?

3 个答案:

答案 0 :(得分:0)

在setup方法中创建类的实例(使用@Before注释)并将参数传递给main方法。这里的关键是你想要测试的。如果您展示您的课程,我可以通过更多提示更新答案。

编辑:如果你真的想要对你的主要方法进行单元测试,你将不得不模拟你的Flight类。如果Flight类中调用的方法返回了某些内容,则必须告诉模拟框架相应地返回内容。

答案 1 :(得分:0)

如果你将I / O内容和输入消耗分开,那么测试内容会更容易。我的意思是把I / O的东西放在某个地方(也许在你的主要部分),然后创建一个方法,将输入作为参数(也许是一个String)。

然后从JUnit测试中调用消耗方法,其参数值强制切换语句中的路径。例如:

[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.

答案 2 :(得分:0)

模拟用户输入可以使用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();
    }

    //...


}

你会想要使用一个单独的线程传递输入,因为main方法将阻塞,直到它可以读取某些内容

可以采取类似的措施来捕获System.out输出