2012-04-21 60 views
0

这篇文章是类似于:thisJMock的 - 如何嘲笑控制台输出

我有两个希望用户输入和具有响应用户输出一个控制台应用程序。我正在编写一些单元测试以确保代码正常工作。我需要能够确保输出和输入是我所期望的。

本质上,我有一个主要方法正在测试,要求文件或输入。在我的测试中,我使用System.setOutSystem.setIn分别将它们设置为PrintStream和InputStream对象的context.mock版本。我不关心什么System.out.println调用,直到我必须测试程序数据的实际处理时,它将结果输出到控制台。因此,要总结:

这里的被测试我的源代码(一些接近,我修剪多出):http://ideone.com/rptC0

下面是我在我的嘲弄程序:http://ideone.com/VkvqM

而这里的,我是例外得到:ideone.com/OEOS8

正如你可以清楚地看到我的期望,我明确地说,我打算打印出完全相同的字符串,我在我的期望中指定了。但是这个例外说这是意想不到的。我不明白...

+0

如果您打算发布链接的代码,[SSCCE](http://sscce.org)可能会让您的答案更快... – DNA 2012-04-21 20:13:07

+0

您是对的,对不起,请在下面重新发布SSCCE。 – 2012-04-21 21:25:02

+0

不幸的是,这不是自包含的(需要其他几个类,比如'Word'和'WordFrequency'),也没有正确的 - 'main'不会编译,因为它使用类型'bool'并调用未定义的方法'inputReadFailure' – DNA 2012-04-21 21:45:39

回答

0

JMock的希望您使用context.checking()然后呼叫测试中的代码,然后电话申报的期望context.assertIsSatisfied()(虽然有时最后一步是使用适当的测试运行隐含如果做)。

在运行任何代码之前,您似乎立即调用context.assertIsSatisfied()

此外,您发布的代码使用变量mn,它似乎没有定义 - 实际上是您正在运行的代码?或者应该该变量为mockIn而不是?

更新:好的,问题可能是您试图模拟静态方法 - JMock不支持这一点 - 请参阅jmock mocking a static method。特别参见JMock作者之一Steve Freeman的回答。

更新2:我会尝试这样的事情,在@Before设置设定一个期望:

@Before 
public void setMinimalMockingExpectations() throws IOException 
{ 
    oldIn = System.in; 
    oldOut = System.out; 
    pipe = new PipedOutputStream(); 
    testIn = new PipedInputStream(pipe); 
    mockOut = context.mock(PrintStream.class); 
    System.setOut(mockOut); 
    System.setIn(testIn); 

    expectQuestion(); 
} 

private void expectQuestion() 
{ 
    Expectations exp = new Expectations() 
    { 
     { 
      one(mockOut).println(main.QUESTION); 
     } 
    }; 
    context.checking(exp); 

} 

@After 
public void reset() 
{ 
    System.setIn(oldIn); 
    System.setOut(oldOut); 
} 

@Test 
public void fileChoiceReturnsFalse() throws IOException 
{ 
    String FILE = "F\n"; 
    pipe.write(FILE.getBytes()); 

    assertFalse(main.promptStringOrFile()); 

    context.assertIsSatisfied(); // can avoid this call by using the right 
            // test runner 
} 

,并创建两个类似的测试,以检查行为输入“I”和任何其他输入(对此问题应重复一次)。

如果您使用BufferedReader.readLine()而不是担心字符,promptStringOrFile()方法可能更清晰。

+0

以及我重新安排它,它仍然没有工作,而使用mn变量。 mn变量是我试图测试的类主模拟版本。 这里的[code](http://ideone.com/rptC0) 这里是[测试](http://ideone.com/VkvqM) – 2012-04-21 21:31:33

+0

啊,问题是,你试图嘲笑一个静态方法。 JMock不支持这一点。看到http://stackoverflow.com/questions/218813/jmock-mocking-a-static-method – DNA 2012-04-21 21:53:59

+0

其实,我编辑它,并得到了一点点......现在我遇到了参数上的参数麻烦读函数接受一个数组。我不知道该怎么做。 [Code](http://ideone.com/pPwCf),[tests](http://ideone.com/MwvzN) [Stack trace]( http://pastebin.com/WRMPT3Aj) – 2012-04-21 22:31:09