IntegrationTestBase
类供所有测试扩展使用。该基类具有一个@Before
(public void setUp()
)和@After
(public void tearDown()
)方法以建立API和DB连接。我一直在做的就是在每个测试用例中覆盖这两个方法,并调用super.setUp()
和super.tearDown()
。但是,如果有人忘记调用超级或将它们放在错误的位置并抛出异常,他们会忘记在finally中调用super等,这可能会导致问题。我想做的是使基类上的
setUp
和tearDown
方法为final
,然后只需添加我们自己的注释@Before
和@After
方法即可。经过一些初步测试,它似乎总是按此顺序调用:Base @Before
Test @Before
Test
Test @After
Base @After
但我有点担心顺序不能保证,可能会引起问题。我找了找,没有看到有关这个问题的任何内容。有人知道我是否可以这样做而不会有任何问题吗?
代码:
public class IntegrationTestBase {
@Before
public final void setUp() { *always called 1st?* }
@After
public final void tearDown() { *always called last?* }
}
public class MyTest extends IntegrationTestBase {
@Before
public final void before() { *always called 2nd?* }
@Test
public void test() { *always called 3rd?* }
@After
public final void after() { *always called 4th?* }
}
@Before
方法的执行顺序不能保证。如果有10个@Before
方法,它们中的每一个都可以在任何顺序下执行;就在其他方法之前执行。 - Swati@Before
和@After
方法是在每个其他类方法之前运行(每个方法运行一次),还是只在整个类方法套件之前和之后运行一次(每个类只运行一次)? - B Tjunit-4.12
中遇到了一个名称冲突的问题,因为我在一个类的@Before(d)方法和其父类的另一个方法中使用了相同的方法名。 - Stephane@BeforeExample
和@AfterExample
(以及所有其他Concordion注释的方法)时,父类方法将先于子类方法被调用。 - Adrian Pronk