所有junit测试后清理

Mat*_*ski 39 java testing unit-testing junit4

在我的项目中,我必须在所有测试之前进行一些存储库设置.这是使用一些棘手的静态规则完成的.然而,我不知道在所有测试之后如何进行清理.我不想保留一些神奇的静态数字来指代所有测试方法的数量,我应该一直保持这些数字.

最受欢迎的方法是添加一些在所有测试之后调用的监听器.JUnit4中是否有任何接口?


编辑:这与@BeforeClass和@AfterClass无关,因为我必须知道最后一次是否调用了使用@AfterClass注释的方法.

Hel*_*eat 41

我正在使用JUnit 4.9.这会有帮助吗?:

import junit.framework.TestCase;

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;

@RunWith(Suite.class)
@SuiteClasses({First.class,Second.class,Third.class})
public class RunTestSuite extends TestCase {
    @BeforeClass
    public static void doYourOneTimeSetup() {
        ...
    }

    @AfterClass
    public static void doYourOneTimeTeardown() {
        ...
    }    
}
Run Code Online (Sandbox Code Playgroud)

编辑:我非常积极(除非我误解了你的问题),我的解决方案正是你要找的.即所有测试运行后的一个拆卸方法.不需要监听器,JUnit有这个功能.谢谢.

  • 我必须枚举所有测试类(现在甚至几个,计数会快速增长),所以不幸的是不可接受 (8认同)
  • 是的,这个类的行为实际上是我正在寻找的,但是,@SuiteClasses注释中的这个令人惊讶的测试类正在丢弃这个解决方案.如果有几个测试类,我发现很难维护.我很害怕在这个问题上没什么可做的,所以感谢你的帮助. (7认同)
  • 如果您不想枚举测试,可以使用ClasspathSuite(https://github.com/takari/takari-cpsuite)执行此处提出的相同解决方案,该方法使用类路径扫描来查找测试 (2认同)

Jur*_*lak 41

我建议使用org.junit.runner.notification.RunListener,例如:

public class TestListener extends RunListener {
  @Override
  public void testRunStarted(Description description) throws Exception {
     // Called before any tests have been run.
  }
  @Override
  public void testRunFinished(Result result) throws Exception {
     // Called when all tests have finished
  }
}
Run Code Online (Sandbox Code Playgroud)

在JUnit java doc中直接阅读.通过在插件配置中添加以下代码,即使使用Maven的surefire(单元测试)插件或故障安全插件(集成测试),您也可以使用它:

<properties>
  <property>
    <name>listener</name>
    <value>com.innovatrics.afismq.it.TestListener</value>
  </property>
</properties>
Run Code Online (Sandbox Code Playgroud)

  • 我更喜欢这个解决方案.您不必为所有类命名 (2认同)

Ale*_*der 11

刚遇到同样的问题.
我的解决方案

  • 对于全局设置:使用(懒惰)单例来访问在测试之前需要实例化的全局内容.访问此单例的第一个测试将触发全局设置过程.
  • 对于全局拆除:使用Java关闭钩子:
    Runtime.getRuntime().addShutdownHook(new Thread(() -> do_your_global_cleanup())));
    Run Code Online (Sandbox Code Playgroud)