をよく見てSTUFF
ください。列挙型である必要があります。
列挙型のテーブル スイッチ
次のような列挙型にスイッチを書くと:
STUFF stuff;
public String getWho() {
switch(this.stuff) {
case THINGIE: return "kid";
case MATERIAL: return "scientist";
default: return "people";
}
}
コンパイラは に基づいてスイッチ テーブルを生成します。その「生成」は、次のようEnum.ordinal
に 内で呼び出されるメソッドで行われます。switch
switch( ($SWITCH_TABLE$com$...STUFF...())[this.stuff.ordinal] )
その方法を部分的にしかカバーしていないかもしれません。テストgetWho()
を 1 回だけ行うと、生成されたメソッドは分岐を見落とします。これは、返されるメソッドint[]
が遅延初期化されているためです。もう 1 つの可能性はcatch
、生成されたメソッド内の es がカバーされていないことですが、それについては何もできません。
ソースとバリアント
私の主な情報源は、enumとJADの操作に関するこの記事です(次のパラメーターをお勧めします: )。-a -dead -noconv -nocast -noclass -v
この記事では、メソッド内で内部クラスが使用されることを除いて$SwitchMap$
、これはほとんど同じであると述べています。これは、古いバージョンの Java またはコンパイラの違いが原因である可能性があります。$SWITCH_TABLE$
static intializer
100%
100% に到達することが本当に決心している場合は、ハッキングしてリフレクション経由で呼び出すことができます。
@Test
public void testSwitches() {
for(Method m : NotCovered.class) {
if(m.getName().startsWith("$SWITCH_TABLE$")) {
m.setAccessible(true);
m.invoke(null); // one for lazy init
m.invoke(null); // one for quick returning the initialized value
}
}
}
私はこのコードを試したり、使用を提案したりしませんでした。単なる例です。
初期の頃、私はプロの環境で 100% に到達しようと試みましたが、最後の 12% では、多くのテスト コーディングとモックが必要でした。最後の 3 パーセントについては、私が必要PowerMock
としていたことと、いくつかの考察が必要でした。これが、彼らが通常80 ~ 90% という基準を設定するもう 1 つの理由だと思います。