Junit 在经历了所有的@Before';发生了什么事?

Junit 在经历了所有的@Before';发生了什么事?,junit,Junit,我们在层次结构中一直使用@Before,以便在测试执行之前将一些测试数据插入数据库。我想在@Test开始运行之前将所有数据提交到数据库 实现这一点的一种方法是将数据作为该测试类“@Before”方法中的最后一步提交。但我们有数百个这样的类,不想进去修改所有这些 我已经玩过ExternalResource@Rule和TestWatcher@Rule……但是在所有的@Before事件发生之后,他们没有办法加入进来 我想我需要考虑构建一个定制的TestRunner来实现这一点 这条路对吗?我觉得你要找

我们在层次结构中一直使用@Before,以便在测试执行之前将一些测试数据插入数据库。我想在@Test开始运行之前将所有数据提交到数据库

实现这一点的一种方法是将数据作为该测试类“@Before”方法中的最后一步提交。但我们有数百个这样的类,不想进去修改所有这些

我已经玩过ExternalResource@Rule和TestWatcher@Rule……但是在所有的@Before事件发生之后,他们没有办法加入进来

我想我需要考虑构建一个定制的TestRunner来实现这一点


这条路对吗?

我觉得你要找的东西不一致。设置一些数据并提交它们是非常接近的操作,不应该属于不同的位置。相反,我宁愿将它们放在一个函数中,并用实际参数设置为要插入的值来调用它。或者使用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();
    }
}

只不过别忘了启动这些新测试

如果没有自定义的运行程序,您无法完成所要求的任务,那么您可以确保在
@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) {
        ...
      }
    });
  }
  ...
}

让您调用的实用方法作为每个测试的第一行怎么样?编写自己的跑步记录的缺点是,你将能够使用其他跑步者(Spring、Theory等)。好吧,那会管用的。但它与我刚才提到的替代品非常接近。把这件事做好是很重要的,所以我希望有一个漂亮的把戏能让我进去。我不是第一个需要这个的人,对吧?我最好的选择是使用sed或您最喜欢的脚本语言中的脚本“进入并修改所有这些”。