Flutter-GetxController派生のMockでのエラー

GetXのGetxController派生クラスのMockを作成する際に、ちょっと悩んだことを記述。

Mockオブジェクトを生成しGet.putすると以下のエラーが出た。

The following MissingStubError was thrown running a test:
‘onStart’
No stub was found which matches the arguments of this method call:
onStart

mockitで作成したMockクラスにonStartがないよというもの。

使い始めたということもありMockitoについてよくわからず、またこの件について検索してみたのだけどあまり情報がなく途方に暮れていたのだけど、以下のgithub上のソースを見て解決策が分かった。

getbloc/packages/getbloc_test/lib/src/mock_controller.dart at 7d277fcceb84c423389b2d9cb3d4b69a2ed357f6 · Eronildo/getbloc
Create GetX Controllers with Events and/or States, instead using Provider as the bloc library uses, GetBloc uses GetX. -...
class MockInternalFinalCallback<T> extends Mock
    implements InternalFinalCallback<T> {}
final top = MockAppTop();
final mockInternalFinalCallback = MockInternalFinalCallback<void>();
when(top.onStart).thenReturn(mockInternalFinalCallback);
when(top.onDelete).thenReturn(mockInternalFinalCallback);
Get.put<AppTop>(top);

onStart/onDeleteにInternalFinalCallbackから作ったMockオブジェクトを割り当てるという感じ。

まあ、分かってみれば、そうだようなという内容だった。

ちなみに上記実装に至る間、GetX側もいくつか迷走していたようだ。

2019年頃の修正では、Mockを作ったらonStartでエラーが出たというIssueが上がっていたようだ。
それに合わせてonStartを呼び出す側で、オブジェクトにonStartがなければ呼び出さないような変更が入った。

しかしその後、その修正が元に戻った。

同時期に、GetxControllerのonStartで呼び出しているクラスがプライベートなのでMockが作れないというのがMockito側のIssueとしてあげられていて、パブリックにすればMockが作れるのにという回答が出ていた。
その回答と合わせて修正実装があげられていて、GetX開発者に連絡が行き修正が反映されたようなのだ。

コメント

タイトルとURLをコピーしました