※ ChatGPTを利用し、要約された質問です(原文:Easy Mockについて)
Easy Mockでstaticメソッドのmock化はできるか?
このQ&Aのポイント
Easy Mockではprivateメソッドはmock化できないとサイトに記述されていたが、同様にstaticメソッドもmock化できないのか疑問がある。
publicメソッドは問題なくmock化できるが、staticメソッドをmockに使用すると「no last call on a mock available」というエラーが発生する。
実際に動かしてみたが、予想通りに動作しない。これが設定やプログラムミスなのか、Easy Mockの仕様なのか判別できない。
別件の質問の別アプローチにてEasy Mockを使用しようと試してみました。
どうもうまくいかないので質問させてください。
Easy Mockではprivateメソッドはmock化できないとサイトに記述されていたのですが、staticメソッドも同様にmock化できないのでしょうか?
publicメソッドは問題なくできたのですが、staticメソッドをmockに使用とすると実行時に「no last call on a mock availavle」というエラーがでます。
IMocksControl c = EasyMock.createControl();
Sample s = c.createMock(Sample.class);
EasyMock.expect(s.print()).antReturn("test");
EasyMock.replay(s);
・
・
・
print()がpublicメソッドならエラーにならないのですが、staticメソッドだとエラーになります(expectの行でエラー)。
staticなので、下記のようなことも試してみました。
EasyMock.expect(Sample.print()).antReturn("test");
そもそもstaticメソッドだけどEasy Mockで試験できるのか?という疑問から実際に動かしてみたのですが、予想通りに動きません。
ただこれが私の設定やプログラムミスで出来ないのか、Easy Mockの仕様なのか判別つかないので、どなたかご存知の方がいましたら教えてもらえないでしょうか?
お礼
素早いご回答有難うございます。 すみません、Class Extensionの方になります。 なるほど、staticも偽装できないのですね。 私がいまテストしようとしているクラスは下記のようになりますので、Easy Mockでは無理そうですね。 ServletContext sc = pageContext.getServletContext(); ApplicationContext context = WebApplicationContextUtils.getRequiredWebApplicationContext(sc); Sample s = context.getBean(id); s.execute(); カスタムタグなのですが、タグハンドラ内からSpringのDIでオブジェクトを取得して実行します。 pageContextはsetterがあるのでMockを渡せますが、WebApplicationContextUtilsのstaticメソッドを最終的に呼び出してしまいます。 getRequiredWebApplicationContextがstaticメソッドでなければEasy Mockで試験できたのでしょうか。 URLについてもオーバライドと隠蔽についても、今までよく知りませんでしたので参考になりました。
補足
>getRequiredWebApplicationContextがstaticメソッドでなければEasy Mockで試験できたのでしょうか。 仮にstaticでなくてもカスタムタグ内でnewしていたら(テストコードからWebApplicationContextUtilsのMockを渡せなければ)、どの道無理という認識で合ってますでしょうか。