我需要在Java中为输入键盘制作一个测试单元,以任何方式存在都很容易吗?
感谢。
答案 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 [输入|输出]流(或类似的东西)来轻松地模拟它。