1. ホーム
  2. java

[解決済み] Java enumをモックして値を追加し、フェイルケースをテストする

2023-06-06 01:23:46

質問

私は 列挙 のスイッチは大体こんな感じです。

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でテストしました。