如何在Java中测试(junit)输入键盘

时间:2010-08-23 18:05:26

标签: java unit-testing input junit

我需要在Java中为输入键盘制作一个测试单元,以任何方式存在都很容易吗?

感谢。

3 个答案:

答案 0 :(得分:3)

将读取键盘的代码分解出来,使其成为一个接口。然后创建两个实现,一个用于生产,它执行“真正的”Java代码来读取键盘;第二个可以从代码访问,特别是从您的JUnit测试。

使用后者,您的测试可以“输入”所需的任何输入。

<强>加了:

这不是有效的代码,我正在键入它的顶部!这也只是一种方法:gpampara下面的方法来制作你自己的Streams也可以。这取决于您的测试需求。

首先制作一个界面

public interface Keyboard
{
    public int getInt() ;
}

然后是“真正的”实施:

public class RealKeyboard
   implements Keyboard
{
    // I haven't done Java keyboard reading in ages, so this is
    //  likely not how to do it, but you should get the idea
    private BufferedReader __r ;

    public RealKeyboard( BufferedReader r )
    {
         __r = r ;
    }

    public int getInt()
    {
         // whatever you need to do with __r
    }
}

然后这是一个可能的测试实现:

public class TestKeyboard
   implements Keyboard
{
    private int __value ;

    public TestKeyboard( int value )
    {
        __value = value ;
    }

    public int getInt()
    {
        return __value ;
    }
}

这当然会返回相同的值,这可能不是你想要的。您可以使用setInt()方法执行实现,以便测试类可以在测试期间设置值,或者您可以将值列表传递给构造函数,并按顺序返回每个值。取决于您需要测试的内容。

然后您的调用代码只传递其中一个:

public class SomeConsumer
{
    private Keyboard __k ;

    public SomeConsumer( Keyboard k )
    { 
          __k = k ;
    }

    // use it in your methods...
}

您可以使用Spring注入它,或者只是在“生产”代码中对其进行硬编码。但是在测试中,您可以传递一个测试实现。

答案 1 :(得分:0)

编写类以将实际的键盘输入与键盘输入的处理分开,然后分别测试两者。

至于键盘输入本身,在读取键之外放置NO功能 - 这样它既可以工作也可以不会......你也可以模拟出给你提供键的类,并让你的模拟类为您正在测试的课程提供“已知”密钥。

答案 2 :(得分:0)

与其他答案类似,但我认为您的抽象应该基于Stream

看到键盘的输入也是一个流,你可以通过在单元测试中提供ByteArray [输入|输出]流(或类似的东西)来轻松地模拟它。

相关问题