我有一组需要执行数据库的测试。我想在执行开始时创建数据库并在最后删除它。
从 maven 我还向 maven-surefire-plugin 添加了一个RunListener,它工作正常。而且我还添加了一个名为ismaven的系统属性变量。当我从 maven 执行测试时,这个变量被初始化,但是当我从 Eclipse 执行测试时,这个变量为空(我使用System.getProperty访问该变量)。
<configuration>
  <properties>
    <property>
      <name>listener</name>
      <value>com.mycompany.MyRunListener</value>
    </property>
  </properties>
  <systemPropertyVariables>
    <ismaven>true</ismaven>
  </systemPropertyVariables>
</configuration>
我所有的数据库测试都继承自一个具有@BeforeClass 和@AfterClass 方法的类。这些方法检查测试是由 Maven 执行还是由 Eclipse 检查ismaven属性的值。如果测试是由 maven 执行的,则ismaven属性有一个值,它们可以做任何事情。但是测试是否正在由 Eclipse 执行,ismaven变量为 null 并且它们启动 (@BeforeClass) 或停止 (@AfterClass) 数据库:
@BeforeClass
public static void checkIfStartDatabase() {   
  String ismaven = System.getProperty("ismaven");
  // If it is not maven, start the database
  if (ismaven == null) {
    startDatabase();
  }
}
@AfterClass
public static void checkIfStopDatabase() {
  String ismaven = System.getProperty("ismaven");
  // If it is not maven, stop the database
  if (ismaven == null) {
    stopDatabase();
  }
}
此解决方案不能 100% 解决您的问题,但如果您实施它,您可以使用 Eclipse 执行(和调试)一个 JUnit 类的所有测试,您还可以使用 Maven 执行项目的所有测试,并保证您将在执行所有测试之前或之后执行一段代码。