这让我有点沮丧……因为我喜欢使用控制台处理程序来启动最复杂的 GUI 应用程序。
我在这里使用的语言是 Groovy,它是 Java 的一种奇妙扩展,可以与普通的旧 Java 混合使用。
class ConsoleHandler {
def loopCount = 0
def maxLoopCount = 100000
void loop() {
while( ! endConditionMet() ){
// ... do something
}
}
boolean endConditionMet() {
loopCount++
loopCount > maxLoopCount // NB no "return" needed!
}
static void main( args ) {
new ConsoleHandler().loop()
}
}
...在测试类(也在 Groovy 中)你可以去
import org.junit.contrib.java.lang.system.SystemOutRule
import org.junit.contrib.java.lang.system.
TextFromStandardInputStream.emptyStandardInputStream
import static org.assertj.core.api.Assertions.assertThat
import org.junit.Rule
import static org.mockito.Mockito.*
class XXTests {
@Rule
public SystemOutRule systemOutRule = new SystemOutRule().enableLog()
@Rule
public TextFromStandardInputStream systemInMock = emptyStandardInputStream()
ConsoleHandler spyConsoleHandler = spy(new ConsoleHandler())
@Test
void readInShouldFollowedByAnother() {
spyConsoleHandler.setMaxLoopCount 10
systemInMock.provideLines( 'blah', 'boggle')
spyConsoleHandler.loop()
assertThat( systemOutRule.getLog() ).containsIgnoringCase( 'blah' )
assertThat( systemOutRule.getLog() ).containsIgnoringCase( 'boggle' )
这里发生的美妙的事情是,简单地通过声明maxLoopCount
语言自动创建两个方法:getMaxLoopCount
和setMaxLoopCount
(你甚至不必费心括号)。
当然,下一个测试将是“如果用户输入 Q,则必须退出循环”或其他什么......但关于 TDD 的要点是你希望它最初失败!
如果必须,可以使用普通的旧 Java 复制上述内容:当然,您必须创建自己的setXXX
方法。