[解決済み] Invalid setup on a non-virtual (overridable in VB) member..." というメッセージのExceptionが発生するのはなぜですか?
2022-01-30 11:28:33
質問
ユニットテストで、bool型を返す非仮想的なメソッドをモックしなければならないことがあります。
public class XmlCupboardAccess
{
public bool IsDataEntityInXmlCupboard(string dataId,
out string nameInCupboard,
out string refTypeInCupboard,
string nameTemplate = null)
{
return IsDataEntityInXmlCupboard(_theDb, dataId, out nameInCupboard, out refTypeInCupboard, nameTemplate);
}
}
というモックオブジェクトを用意しました。
XmlCupboardAccess
クラスのメソッドにモックを設定しようとしているのですが、以下のようになります。
[TestMethod]
Public void Test()
{
private string temp1;
private string temp2;
private Mock<XmlCupboardAccess> _xmlCupboardAccess = new Mock<XmlCupboardAccess>();
_xmlCupboardAccess.Setup(x => x.IsDataEntityInXmlCupboard(It.IsAny<string>(), out temp1, out temp2, It.IsAny<string>())).Returns(false);
//exception is thrown by this line of code
}
しかし、この行は例外を投げます
Invalid setup on a non-virtual (overridable in VB) member:
x => x.IsDataEntityInXmlCupboard(It.IsAny<String>(), .temp1, .temp2,
It.IsAny<String>())
この例外を回避する方法について、何かご提案があれば教えてください。
解決方法は?
Moqは非仮想的なメソッドやシールドされたクラスをモックできません。モックオブジェクトを使用してテストを実行している間、MOQは実際にあなたの"XmlCupboardAccess"を継承するインメモリプロキシ型を作成し、あなたが"SetUp"メソッドで設定した動作をオーバーライドしています。そして、C#ではご存知のように、何かをオーバーライドできるのは、それが仮想としてマークされている場合だけです。Javaでは、静的でないメソッドはすべてデフォルトで仮想であると仮定しています。
もうひとつ考慮すべきことは、"CupboardAccess"にインターフェースを導入し、代わりにそのインターフェースのモッキングを始めることです。これは、コードの分離を助け、長い目で見たときにメリットがあります。
最後に、.NETのようなフレームワークがあります。 タイプモック と ジャストモック これらは IL で直接動作するため、非仮想的なメソッドをモックすることができます。しかし、どちらも商用製品である。
関連
-
[解決済み】指定されたキャストが有効でない?
-
[解決済み] エンティティタイプ ApplicationUser は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み】GDI+、JPEG画像をMemoryStreamに変換する際にジェネリックエラーが発生しました。
-
[解決済み] 保護レベルによりアクセス不能になりました。
-
[解決済み】ソケットのアドレス(プロトコル/ネットワークアドレス/ポート)は、通常1つしか使用できない?
-
[解決済み】C# ASP.NET使用時に「WebClientのリクエスト中に例外が発生しました。
-
[解決済み】「namespace x already contains a definition for x」エラーの修正方法は?VS2010にコンバートした後に発生しました。
-
[解決済み】HRESULTからの例外:0x800A03ECエラー
-
[解決済み】Moqを使用してメソッド呼び出しを検証する
-
[解決済み】スレッド終了またはアプリケーションの要求により、I/O操作が中断されました。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] メンバー '<メンバー名>' にインスタンス参照でアクセスできない
-
[解決済み】C#はJavaのcharAt()と同等?)
-
[解決済み】ORA-01008: すべての変数がバインドされていません。これらはバインドされています。
-
[解決済み】C# - パスに不正な文字がある場合
-
[解決済み】なぜこのコードはInvalidOperationExceptionを投げるのですか?
-
[解決済み】Moqを使用してメソッド呼び出しを検証する
-
[解決済み】Linq 構文 - 複数列の選択
-
[解決済み】画像のペイントにTextureBrushを使用する方法
-
[解決済み】WebResource.axdとは何ですか?
-
[解決済み】データが存在しないのに読み込もうとする試みが無効である