是什么@BeforeClass和Spring @TestExecutionListener befo

2019-06-28 07:59发布

什么是使用JUnit @BeforeClass和Spring @TestExecutionListener beforeTestClass(的TestContext的TestContext) “钩子” 之间的区别? 如果是有区别的,这什么情况下使用哪一个?

Maven依赖关系:
弹簧核心:3.0.6.RELEASE
弹簧上下文:3.0.6.RELEASE
弹簧试验:3.0.6.RELEASE
弹簧数据公共核心:1.2.0.M1
弹簧数据的mongodb:1.0.0.M4
蒙戈的Java驱动程序:2.7.3
JUnit的:4.9
CGLIB:2.2

使用JUnit @BeforeClass注释:

import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.Assert;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;

@ContextConfiguration(locations = { "classpath:test-config.xml" })
public class TestNothing extends AbstractJUnit4SpringContextTests {

    @Autowired
    PersonRepository repo;

    @BeforeClass
    public static void runBefore() {
        System.out.println("@BeforeClass: set up.");
    }

    @Test
    public void testInit() {
        Assert.assertTrue(repo.findAll().size() == 0 );
    }
}

=> @BeforeClass: set up.
=> Process finished with exit code 0

使用弹簧钩:

(1)重写beforeTestClass(TextContext的TestContext):

import org.springframework.test.context.TestContext;
import org.springframework.test.context.support.AbstractTestExecutionListener;

public class BeforeClassHook extends AbstractTestExecutionListener {

    public BeforeClassHook() { }

    @Override
    public void beforeTestClass(TestContext testContext) {
        System.out.println("BeforeClassHook.beforeTestClass(): set up.");
    }
}

(2)使用@TestExecutionListeners注释:

import org.springframework.test.context.TestExecutionListeners;  
// other imports are the same    

@ContextConfiguration(locations = { "classpath:test-config.xml" })
@TestExecutionListeners(BeforeClassHook.class)
public class TestNothing extends AbstractJUnit4SpringContextTests {

    @Autowired
    PersonRepository repo;

    @Test
    public void testInit() {
        Assert.assertTrue(repo.findAll().size() == 0 );
    }
}

=> BeforeClassHook.beforeTestClass(): set up.
=> Process finished with exit code 0

Answer 1:

TestExecutionListeners是可重复使用的外部化的代码, 仪器您的测试方式。

因此,如果您实现TestExecutionListener ,你可以重复使用它跨测试类层次结构和潜在的跨项目,根据您的需要。

在另一面,一个@BeforeClass方法当然只能在单个测试类层次结构中使用。

但是请注意,是JUnit的也支持规则 :如果您实现org.junit.rules.TestRule你可以声明它作为一个@ClassRule来实现同样的事情...与额外的好处,一个JUnit的规则可以像一个被重用春天TestExecutionListener

所以这真的取决于你的使用情况。 如果你只需要在一个测试类或单个测试类层次结构使用“课前”功能,那么你最好去刚刚实施的简约路线@BeforeClass方法。 但是,如果你预见到你需要在不同的测试类层次结构或跨项目的“课前”功能,你应该考虑实施定制TestExecutionListener或JUnit的规则。

弹簧的好处TestExecutionListener通过JUnit的规则是TestExecutionListener可以访问TestContext并因此获得了Spring ApplicationContext这JUnit的规则将无法访问。 此外, TestExecutionListener可自动发现和有序 。

相关资源

  • SPR-8854

问候,

山姆(Spring的TestContext框架的作者)



Answer 2:

与@BeforeClass第一个解决方案没有应用程序上下文加载。 我没有exteneded AbstractJUnit4SpringContextTests时和定义@ContextConfiguration。 我认为,听者是让@BeforeClass方法之前加载上下文的唯一途径。 甚至更好的扩展基于SpringJUnit4ClassRunner类提到这里



文章来源: What is the difference between @BeforeClass and Spring @TestExecutionListener beforeTestClass()