====== Groovy Unit Test ======
* [[http://groovy.codehaus.org/Testing+Guide|Groovy Testing Guide]]
* [[http://groovy.codehaus.org/Unit+Testing|Groovy Unit Testing]]
* [[http://groovy.codehaus.org/Using+JUnit+4+with+Groovy|Using JUnit 4 with groovy]]
* [[http://cobertura.sourceforge.net/|Cobertura]] Groovy까지 지원하는 코드 커버리지 툴
===== Stub =====
* 기본 Stub 형태
// Class Foo가 있을 때
import groovy.mock.interceptor.StubFor
def fooStub = new StubFor(Foo)
// 메소드 행위 지정
fooStub.demand.firstMethod { /* 행위 */ }
fooStub.demand.secondMethod { /* 행우 */ }
fooStub.use {
테스트코드
}
* 동일 메소드에 대한 demand를 여러본 호출하면 그 이후 메소드 호출시 demand 순서대로 행위를 수행함.
* ''someStub.demand.methodOne(0..35) { ... }'' : 해당 메소드 호출 횟수를 Range로 지정한다.
* 메소드 인자는 Colosure에서 받는다.
someStub.demand.methodOne { number ->
assert 0 == number % 2
return 1
}
* 메소드 호출 검증. use 뒤에 verify()를 넣는다.
someStub.expect.verify()
===== Mock =====
* 기본적으로는 Stub과 같으나, 동작을 엄격하게 정의하고 확인한다.
* 스텁의 경우는 테스트되는 클래스를 주변에서 독립시킨 후 내부의 변화에 대해 검증한다. 목의 경우는 검증의 초점이 그 클래스와 협력자들 간의 상호 작용으로 옮겨 간다. 클래스가 외부 세계와의 '규약protocol'을 잘 지키는지 검증하는 것이다.
* Mock과는 달리 verify() 없이 동작(메소드)가 순서대로 모두 호출 됐는지 검증한다.
* 기본 Mock 형태
import groovy.mock.interceptor.MockFor
def fooMock = new MockFor(Foo)
fooMock.demand.sort()
fooMock.demand.getMachines { /* 행위 */}
fooMock.use {
테스트 코드
}
===== Java Unit Test로 수행하기 =====
* [[http://groovy.codehaus.org/api/groovy/util/AllTestSuite.html|groovy.util.AllTestSuite]]를 사용하면 그루비 테스트를 Java 단위 테스트인 것 처럼 호출할 수 있고, 이 때문에 각종 Java IDE에서 JUnit 테스터와 자연스럽게 통합된다.
* ''-Dgroovy.test.dir=src''
* ''-Dgroovy.test.pattern=*Test.groovy''
* 코드로 테스트 수트 만들기
def suite = AllTestSuite.suite(".", "*Test.groovy")
junit.textui.TestRunner.run(suite)
===== shouldFail for JUnit 4 =====
* [[http://groovy.codehaus.org/api/groovy/util/GroovyTestCase.html]]의 ''shouldFail''로 Exception 테스트
class ArithmeticTest {
final shouldFail = new GroovyTestCase().&shouldFail
@Test
void divideByZero() {
String message = shouldFail(ArithmeticException) {
println 1/0
}
assertEquals message, "expected exception message."
}
}