Java jUnit:在任何测试类运行之前运行的测试套件代码

21

我有一个测试套件类:

@RunWith(Suite.class)
@Suite.SuiteClasses({
    GameMasterTest.class,
    PlayerTest.class,
})
public class BananaTestSuite { 

我需要使用什么注解才能使得这个类中的一个函数在包含实际测试的所有类之前运行?目前,我正在执行以下操作,它可以工作,但可读性不太好:

static {
    try {
        submitPeelAction = new Player(new GameMaster(1)).getClass().getDeclaredMethod("submitPeelAction");
    } catch (SecurityException e) {
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    }
    submitPeelAction.setAccessible(true);
}

我尝试过使用@BeforeClass,但它没有起作用。


我认为这个可以工作 - 或许将其放在静态构造函数中...不要忘记记录! - Hamish Grubijan
1
我认为没有一个可能回答你的人理解你试图获取某种套件级别的Before。 - bmargulies
这里提供了一个有趣的答案:http://stackoverflow.com/a/26343242/363573 - Stephan
5个回答

24

制作一个包含被@BeforClass注解的方法的超级测试类。从这个类中扩展所有的测试类,例如:

@Ignore
public class BaseTest {
    @BeforeClass
    public static void setUpBaseClass() {
        //Do the necessary setup here
    }
}

此方法将在子类中的任何@BeforeClass注解方法之前运行:来源。确保该方法名称未在任何子类中使用,以防止遮蔽。
如果您只需要运行一次此方法(例如,如果您正在创建/初始化所有测试都要使用的大型资源),请在超类中设置一个标志以检查方法是否已运行。
此设计还将确保如果更改测试运行程序,则无需更改其他任何内容。

10

使用@Before来定义setUp()方法,使用@After来定义tearDown()方法。

编辑:经过一些测试,我发现@Before@After不适用于测试套件。在这种情况下,您应该使用@BeforeClass和一个静态方法来封装您的初始化代码。

@RunWith(Suite.class)
@SuiteClasses( { ContactTest.class })
public class AllTests {

    @BeforeClass
    public static void init() {
        System.out.println("Before all");
    }

}

3

首先:如果你使用的是最新的JUnit,即4.7或更高版本,则也可以使用Rules完成此操作。有关起点,请参见http://www.infoq.com/news/2009/07/junit-4.7-rules

据我了解,在套件类中的静态块是一个不错的解决方案。

缺点是它只会在运行整个测试套件时调用,而不是单独的测试或测试类。因此,另一种选择是从所有类的@BeforeClass方法中调用套件类中相同的静态方法。


2

使用@BeforeClass为一个方法做注释,使其在该类中所有测试运行之前运行。使用@Before为一个方法做注释,使其在该类中每个测试运行之前运行。

关于您的评论,@BeforeClass可以正常工作。您是否在该方法内抛出了异常?


1
他不想要其中任何一个,他想要附加到整个测试套件之前运行任何BeforeClass方法的内容。 - bmargulies
嗯,也许你是对的。我承认这似乎不是很清楚。 - Brian Agnew

1
尝试使用 @before,创建一个方法来实例化你需要的所有对象。如果需要在结束时清除某些内容,只需使用 @After。类似这样的代码:
@Before
public void instanceMeasureList() {
    /* all what you need to execute before starting your tests
    */
}

@Test
public void testRequest() {
    fail("Not yet implemented");
}

@Test
public void testEpochDate() {
    fail("Not yet implemented");
}
@After 
public void deleteOutputFile() {
      fail("Not yet implemented");
}

如果您需要更多帮助,请访问以下链接:link - sebas sierra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接