uber/mockoloのclassモック生成のバグを修正した
- Uberが開発するSwift用のモック自動生成ツールで、ここ1〜2年で採用が増えていそうな雰囲気
- 2019年のSwiftモック事情 - いけだや技術ノート でも紹介しました
というものです。
mockoloはv1.1.3からprotocolだけでなくclassのモック生成もできるようになったのだけど、これを実際に使おうとしてみると生成されたコードがコンパイルエラーになった。
具体的には、次のようなデフォルト値ありのpropertyを持つclassで問題が発生していた。
// Foo.swift /// @mockable class Foo { var foo: Int = 0 } // Mocks.swift class FooMock: Foo { private(set) var fooSetCallCount = 0 override var foo: Int = 0 { didSet { fooSetCallCount += 1 } } }
- stored propertyをoverrideして新たなデフォルト値を代入することはできない
- stored propertyを新たなデフォルト値でoverrideしようとして、そこにproperty observer (
willSet
/didSet
)を付けようとするとVariable with getter/setter cannot have an initial value
というおかしなコンパイルエラーになる- property observerはgetter/setterではない
propertyのモックにデフォルト値を代入するのは元々protocolモック用の実装だったので、classモックではデフォルト値を代入しないようにして解決した。
これによって生成コードはこうなる:
class FooMock: Foo { private(set) var fooSetCallCount = 0 override var foo: Int { didSet { fooSetCallCount += 1 } } }
ということで、こちらの修正が含まれたv1.3.2がリリースされていたので、どうぞお使いください。mockoloのclassモックはあまり枯れていないようなので枯らしていきましょう。