0

私は多くのテストを含む多くのjunit4テストクラスを持っています。これらのテストの多くは、データベースにアクセスするためにデータソースを必要とします。

テストを高速化するために、すべてのテストクラスで単一のデータソースを共有したいと思います。これにより、接続コストを回避できます。

そこで、データソースを静的変数に入れました。

しかし、私はそれを閉じる方法を見つけていません!

@Rule + TestWatcherを使用すると、単一のテストの前後にコードを実行できます... @ClassRule + TestWatcherを使用すると、単一のテストクラスの前後にコードを実行できます...

しかし、実行されたすべてのテストクラスの実行後にコードを実行するにはどうすればよいですか?

私はjunitsテストのすべて、1つ、または任意のサブセットを実行しているため、テストスイートは適切ではないようです。

何か案が?

4

2 に答える 2

0

その場合、 JVMシャットダウンフックのインストールはそれほど醜く見えません。

オブジェクトがガベージコレクションされている場合にのみ呼び出されるfinalize()メソッドよりもはるかに信頼性があります。

プロセスが中断された場合は呼び出されませんが、その場合はとにかく何もできません。だから私は大きな欠点を見つけませんでした。

ありがとう。

于 2013-02-01T13:35:40.223 に答える
0

ClassRuleを使用できます

public static class GlobalDataSource extends ExternalResource
  private int count = 0;
  private DataSource dataSource;

  private GlobalDataSource() {};

  public static final GlobalDataSource INSTANCE = new GlobalDataSource();

  public DataSource get() {
    if (dataSource == null) {
      throw new IllegalStateException();
    }
    return dataSource;
  }

  @Override
  protected void before() throws Throwable {
    if (count++ == 0) {
      dataSource = createDataSource();
    }
  }

  @Override
  protected void after() {
    if (--count == 0) {
      try {
        destroyDataSource(dataSource);
      } finally {
        dataSource = null;
      }
    }
  };
};

テストでは:

@RunWith(JUnit4.class)
public class FooTest {
  @ClassRule public static GlobalDataSource source = GlobalDataSource.INSTANCE;

  @Test
  public void readDataSource() {
    ...
  }
}

次に、スイートを作成します。

@RunWith(Suite.class)
@SuiteClasses(FooTest.class, BarTest.class ...)
public class AllTests {
  @ClassRule public static GlobalDataSource source = GlobalDataSource.INSTANCE;
}

テストのグローバル状態は、コードのグローバル状態と同じくらい問題になる可能性があることに注意してください。1つのテストで失敗すると、他のテストも失敗する可能性があります。

于 2013-02-01T06:51:01.523 に答える