概要
Spockでテストコードを書く際に、finalなクラスをMockする方法。
Mock()をすると例外が発生
finalなクラスをMockしようとすると、例外が発生します。
例としてjava.time.LocalDateをMockしてみます。
@Unroll
class MockFinalClassSpec extends Specification {
def "finalなクラスをMockしてみる"() {
setup:
// 存在しない日付を返すようMockしてみる
def localDate = Mock(LocalDate)
localDate.getDayOfMonth() >> 100
expect:
localDate.getDayOfMonth() == 100
}
}
実行すると例外が発生します。
org.spockframework.mock.CannotCreateMockException:
Cannot create mock for class java.time.
LocalDate because Java mocks cannot mock final classes.
If the code under test is written in Groovy, use a Groovy mock.
GroovyMock()を使えばうまくいく
実は例外のメッセージにも出ているのですが、GroovyMockを使えばMockできます。
@Unroll
class MockFinalClassSpec extends Specification {
def "finalなクラスをMockしてみる"() {
setup:
// GroovyMockを使う
def localDate = GroovyMock(LocalDate)
localDate.getDayOfMonth() >> 100
expect:
localDate.getDayOfMonth() == 100
}
}