2

SQLExceptionデータベース エラーをシミュレートするために を作成しようとする単体テストがあります。SQLExceptionのコンストラクターには、静的初期化ブロックを持つ への呼び出しがありますDriverManager。このタイプのセットアップで静的ブロックを抑制できると考えました。

@RunWith(PowerMockRunner.class)
@SuppressStaticInitializationFor({"java.sql.DriverManager"})
public class StaticTest 
{
    @Test
    public void testStaticSuppress() throws Exception
    {
        SQLException ex = new SQLException();
        expect(...).andThrow(ex);
    }
}

テストを実行すると、静的ブロックDriverManagerがまだ呼び出されます。私は何を間違っていますか?


明確化

  • Powermock 1.5 を実行しています - v1.5 を使用するとシステム クラスをモックできるという印象を受けました
  • 静的初期化ブロックを実行すると、次DriverManagerの例外が発生します。

2013 年 10 月 15 日 1:06:24 PM oracle.jdbc.driver.OracleDriver registerMBeans

警告: Oracle JDBC Diagnosability MBean の登録中にエラーが発生しました。

java.lang.LinkageError: ローダー制約違反: メソッド「java.lang.management.ManagementFactory.getPlatformMBeanServer()Ljavax/management/MBeanServer;」を解決するとき 現在のクラス oracle/jdbc/driver/OracleDriver のクラス ローダー (org/powermock/core/classloader/MockClassLoader のインスタンス) と、解決されたクラス java/lang/management/ManagementFactory のクラス ローダー (のインスタンス) には、 javax/management/MBeanServer タイプの異なる Class オブジェクト。署名に使用

  • SQLExceptionモックを作成して、直接インスタンス化することはできないことに気づきました。91 の異なる単体テストを更新することになるので、私はむしろそのルートには行きたくありません。PowerMock のドキュメントによると、私のコードは問題なく動作するように見えたので、質問しました。
4

2 に答える 2

2

Powermock は、システムまたはブートストラップ クラスローダー (パッケージのクラスを含む jre クラスのように) によってロードされるクラスに対して静的初期化子が実行されるのを防ぐことができないのではないかと思います (確かではありませんjava.sql)。


Powermock Google グループに投稿した後、次のような応答がありました

powermock 1.2.5以降、これらのクラスでメソッド、スタブメソッドなどをモック、抑制できますが、静的初期化子を抑制することはできません。

于 2013-10-15T18:56:47.613 に答える