[解決済み] Java enumをモックして値を追加し、フェイルケースをテストする
質問
私は 列挙 のスイッチは大体こんな感じです。
public static enum MyEnum {A, B}
public int foo(MyEnum value) {
switch(value) {
case(A): return calculateSomething();
case(B): return calculateSomethingElse();
}
throw new IllegalArgumentException("Do not know how to handle " + value);
}
で、すべての行がテストでカバーされるようにしたいのですが、コードはすべての可能性に対処することが期待されているので、switchの中で対応するcaseステートメントなしで値を供給することはできません。
enum を拡張して追加の値を追加することは不可能であり、単に equals メソッドをモックして
false
を返すようにモックしてもうまくいきません。なぜなら、生成されるバイトコードはカーテンの後ろにあるジャンプテーブルを使って適切なケースに移動するからです...。というわけで、もしかしたらPowerMockとかで黒魔術が実現できるかもしれないと考えてみました。
ありがとうございました!
編集 :
私は列挙を所有しているので、値にメソッドを追加するだけで、スイッチの問題を完全に回避することができると考えました。
どのように解決するのですか?
ビルドシステムとして Maven を使用できる場合、よりシンプルなアプローチを使用できます。テストのクラスパスに追加の定数を持つ同じ列挙型を定義するだけです。
例えば、ソースディレクトリ(src/main/java)の下でenumをこのように宣言したとしましょう。
package my.package;
public enum MyEnum {
A,
B
}
次に、テストソースディレクトリ(src/test/java)で、全く同じenumを次のように宣言します。
package my.package
public enum MyEnum {
A,
B,
C
}
テストは "overloaded" enum を持つ testclass パスを参照し、あなたは "C" enum 定数を持つあなたのコードをテストすることができます。そして、IllegalArgumentExceptionが表示されるはずです。
maven 3.5.2, AdoptOpenJDK 11.0.3, IntelliJ IDEA 2019.3.1 でWindowsでテストしました。
関連
-
[解決済み] Java enumのメンバーを比較する:==またはequals()?
-
名前 'XXX' を持つ Bean の作成に失敗しました。自動依存関係の注入に失敗しました 解決方法
-
Junitのユニットテストエラー
-
JNIエンカウンターエラー:構造体またはユニオンではない何かでメンバー 'FindClass' のリクエスト
-
Web Project JavaでPropertiesファイルを読み込むと、「指定されたファイルがシステムで見つかりません」というソリューションが表示されます。
-
[解決済み] Javaで配列に特定の値が含まれているかどうかを判断するにはどうすればよいですか?
-
[解決済み] Javaで文字列値からenum値を取得する方法
-
[解決済み] C#でenumからint値を取得する
-
[解決済み] Javaでenumを繰り返し処理するためのforループ
-
[解決済み] Enum 値から文字列名
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
実行中にEclipseがポップアップする A Java Exception has occurred
-
Springの設定でxsdファイルのバージョン番号を設定しない方が良い理由
-
Java Notes 005_この行に複数のマーカーがある - キーを変数に解決できない - シンタックスエラー、ins
-
代入の左辺は変数でなければならない 解答
-
org.xml.sax.SAXParseExceptionのエラー解決方法
-
Spring Bootは、Tomcatの組み込みのmaxPostSizeの値を設定します。
-
1分でわかる!恋人の写真をIDEAの背景画像に設定する方法【おすすめ集
-
アクセス制限の解決方法: ---- in Java
-
IDEAError:javaの依存性エラー。Annotation processing is not supported for module cycles...(アノテーション処理はモジュールサイクルではサポートされていません。
-
[解決済み] JUnit Testアノテーションを使用して例外メッセージをアサートするにはどうすればよいですか?