LoginSignup
4
1

More than 5 years have passed since last update.

Spockで finalなクラスをMockする

Posted at

概要

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
    }
}

参考

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1