【问题标题】:Test each switch/case with jUnit使用 jUnit 测试每个开关/案例
【发布时间】:2011-11-30 18:09:10
【问题描述】:

我正在尝试使用 jUnit 测试每个 switch/case 块,但我不确定如何让每个 TestCase 对应于不同的 switch/case。

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

    }


}

我的菜单类(即时测试类)有一个 main() 方法。在该方法中,我正在读取用户输入,然后切换该输入。

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

【问题讨论】:

  • 你的 main() 方法如何读取用户的输入?

标签: java unit-testing


【解决方案1】:

如果将 I/O 内容和输入消耗等内容分开,则测试内容会更容易。我的意思是在某个地方(可能在您的 main 中)有 I/O 的东西,然后创建一个将输入作为参数(可能是字符串)的方法。

然后,只需使用在 switch 语句中强制路径的参数值从 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】:

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

    编辑:如果你真的想对你的 main 方法进行单元测试,你必须模拟你的 Flight 类。如果 Flight 类中调用的方法返回了一些东西,你必须告诉模拟框架相应地返回一些东西。

    【讨论】:

    • 首先,我正在向用户打印一个菜单。然后用户输入哪个菜单项(1、2、3、4...)。然后该输入被 switch()ed。案例“1”:例如只调用一个方法 Flight.listPassengers();。测试就是输出是否与我的预期输出匹配(我必须将其硬编码到测试方法中)。
    • 其他情况需要用户进一步输入。例如,案例 2 要求用户输入新的航班数据。
    【解决方案3】:

    可以使用 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 输出

    【讨论】:

    • 那么你将如何获取输出呢?然后我可以使用断言来根据一些测试数据检查输出。
    • @Nick 复制/过去和s/in/out/s/out/in/
    猜你喜欢
    • 2019-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    相关资源
    最近更新 更多