20

単体テストを実行するたびに読み取りたくないファイルのバイト データとして、非常に大きなバイト配列 (8000 バイト以上) を静的に定義した単体テストがあります。

private static final byte[] FILE_DATA = new byte[] {
12,-2,123,................
}

これは Eclipse 内で正常にコンパイルされますが、Ant スクリプトを介してコンパイルすると、次のエラーが発生します。

[javac] C:\workspace\CCUnitTest\src\UnitTest.java:72: code too large
[javac]     private static final byte[] FILE_DATA = new byte[] {
[javac]                                 ^

これを回避できる理由と方法はありますか?


回答: Shimi の回答でうまくいきました。バイト配列を別のクラスに移動したところ、正常にコンパイルされました。ありがとう!

4

3 に答える 3

24

Java のメソッドは、バイト コードで 64k に制限されています。静的初期化は単一のメソッドで行われます (リンクを参照)
ファイルから配列データを読み込もうとするかもしれません。

于 2008-10-28T12:34:50.817 に答える
0

@BeforeClass静的メソッドでファイルからバイト配列をロードできます。これにより、すべての単体テストで一度だけロードされるようになります。

于 2008-10-28T17:12:34.203 に答える
0

それぞれに独自の 64KB 制限があるため、内部クラスを活用できます。内部クラスはメインクラスと同じ静的初期化子の制限を受けるため、単一の大きな配列では役に立たない場合があります。ただし、配列を別のクラスに移動することで問題を解決できたと述べたので、メインクラスにこの単一の配列以上のものをロードしていると思われます。

それ以外の:

private static final byte[] FILE_DATA = new byte[] {12,-2,123,...,<LARGE>};

試す:

private static final class FILE_DATA
{
    private static final byte[] VALUES = new byte[] {12,-2,123,...,<LARGE>};
}

その後、FILE_DATA.VALUES[i]代わりにとして値にアクセスできますFILE_DATA[i]が、64KB ではなく 128KB の制限が適用されます。

于 2014-03-25T14:14:54.633 に答える