2

1 つのクラスの行のチャンク (強調表示されていない、クラス自体のみが強調表示されている) を除いて、私の Java コードについて emma によってほぼ 100% のカバレッジが報告されています。

問題の「方法」は次のようにリストされています。

$SWITCH_TABLE$com$ ...STUFF... (): int []

これは何を指している可能性がありますか?それはある種の自動生成されたメソッドのようで、実際のコード行を追跡できない/テスト方法がわからないなど.

助けてください。:)

4

2 に答える 2

3

をよく見て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 つの理由だと思います。

于 2014-06-06T23:18:46.920 に答える
0

Emma は、実行されるとは思われないコードのセクションについて文句を言うことがあります。この場合、呼び出す必要のないブリッジング メソッドがあると思われます。

例えば

class A<N extends Number> {
    void method(N n) { }
}

class B extends A<Integer> {
    void method(Integer n) { }
}

この場合、クラス B には 2 つのメソッドがあります。1つはvoid method(Integer)、これはJVMの観点からAのものをオーバーライドしません。オーバーロードするため、生成される別の「ブリッジ」メソッドがあります。void method(Number n) { method((Integer) n); }

于 2012-09-12T08:22:39.340 に答える