2

階層全体で@Beforeを使用して、テストを実行する前にいくつかのテストデータをデータベースに挿入しています。@Testの実行が開始される直前に、すべてのデータをデータベースにコミットしたいと思います。

これを行う1つの方法は、このテストクラスの@Beforeメソッドの最後のステップとしてデータをコミットすることです。しかし、そのようなクラスは何百もあり、それらすべてを変更したくありません。

私はExternalResource@RuleとTestWatcher@Ruleで遊んだことがあります...しかし、すべての@Beforeが発生した後、それらをフックする方法はありません。

これを行うには、カスタムTestRunnerの構築を検討する必要があると思います。

それは正しい道ですか?

4

2 に答える 2

0

カスタムランナーなしでは要求していることを完全に実行することはできませんが、@Beforeメソッドで作成されたすべてのデータがルールでコミットされていることを確認できます。

public class LocalDatabase extends ExternalResource {
  private DataSource dataSource;

  @Override
  protected void before() {
    dataSource = createLocalDatabase();
  }

  @Override
  protected void after() {
    try {
      destoyLocalDatabase(dataSource);
    } finally {
      dataSource = null;
    }
  }

  public void run(Callback callback) {
    if (dataSource == null) {
      throw new IllegalStateException("No DataSource");
    }
    Collection con = null;
    try {
      con = ds.getConnection(DB_USERNAME, PASSWORD);
      callback.execute(con);
      con.commit();
    } finally {
      if (con != null) con.close();
    }
  }

これを基本クラスのルールとして使用できます。

public DatabaseTest {
  @Rule
  public LocalDatabase final localDatabase = new LocalDatabase();
}

@Beforeそして、それを任意のサブクラスのメソッドで使用できます

public UserDaoTest extends DatabaseTest {

  @Before
  public void populateInitialData() {
    localDatabase.run(new Callback() {
      @Override
      public void execute(Connection con) {
        ...
      }
    });
  }
  ...
}
于 2013-02-10T04:37:37.403 に答える
0

あなたが探しているものは、私には矛盾しているようです。一部のデータを設定してコミットすることは非常に密接な操作であり、別の場所に属すべきではありません。それどころか、それらを 1 つの関数に入れ、実際のパラメーターを挿入したい値に設定して呼び出します。または、SQL 文字列を実際のパラメーターとして使用します。そして、@Before からこの関数を呼び出します

主張するなら、やっても問題ありません。Junit クラスの子孫クラスを作成します。

package ...;
import org.junit.Before;
public class NewAndBetterYourTest1 extends YourTest1 {
    @Override
    @Before
    public void setUp() {
        super.setUp(); // this is where you are setting everything.
        makeCommits();
    }
}

これらの新しいテストを開始することを忘れないでください

于 2012-11-30T10:41:43.193 に答える