Java junit中测试类的通用@before和@after

Java junit中测试类的通用@before和@after,java,junit4,testcase,Java,Junit4,Testcase,是否有可能在多个测试类中使用一个通用的>之前和>之后夹具 我已经根据模块(库存、销售、采购等)将测试(划分为类)分开。对于所有这些测试,用户登录是一个先决条件,目前我在每个类的@之前都有它。问题是当我需要更改用户id或密码时,我需要在每个类中进行更改。是否有一种方法可以在所有测试类中使用,在/@之前之后编写?在这种情况下,testsuite是否能派上用场?之前的@和之后的适用于继承: public abstract class AbstractTestCase { @Before

是否有可能在多个测试类中使用一个通用的
>
之前和
>之后夹具


我已经根据模块(库存、销售、采购等)将测试(划分为类)分开。对于所有这些测试,用户登录是一个先决条件,目前我在每个类的
@之前都有它。问题是当我需要更改用户id或密码时,我需要在每个类中进行更改。是否有一种方法可以在所有测试类中使用,在
/
@之前
之后编写
?在这种情况下,testsuite是否能派上用场?

之前的
@和之后的
适用于继承:

public abstract class AbstractTestCase {

    @Before
    public void setUp() {
        // do common stuff
    }
}
如果您想在每个测试用例中执行特定的操作,您可以覆盖它:

public class ConcreteTestCase extends AbstractTestCase {

    @Before
    @Override
    public void setUp() {
        super.setUp();
        // do specific stuff
    }
}

您可以在抽象父类中使用
@Before
注释,如下所示:

public class TestMe extends TestParent {
    @Test
    public void test() {
        System.out.println("Hi, here is a test. The username is: " + getUsername());
    }
}
对于父类:

public abstract class TestParent {
    private String username;

    @Before
    public void setUp() {
        username = "fred";
    }

    public String getUsername() {
        return username;
    }
}

您可以为测试套件创建
@ClassRule
。每次测试都会调用它。有关如何在之前/之后应用,请参见API和示例。

我知道两种解决方案:

  • 使用@vikingsteve评论中提到的抽象基类
  • 使用规则。您可以实现您的自定义规则,该规则执行您需要的操作,然后将其添加到您需要的每个测试用例中

    public class MyTest {
        @Rule Rule myBeforeAfterRule = new MyTestLifecycleRule();
    
        // your code
    }
    

  • 基于规则的解决方案IMHO更加灵活,因为继承并不总是适用于所有用例。此外,您可以在一个测试用例中组合多个规则

    你试过把它们放在一个抽象的父类中吗?这个问题有很多很好的答案,但是我建议如果你需要在很多地方提供登录信息,那么你可能想看看你的类结构。测试一个处理登录的类,并在需要登录的任何地方模拟该类。模拟确实是一个好主意。然而,我正在寻找的方法更多的是通用的,而登录就是一个例子。有些人说我找不到合适的链接来嘲弄。你能提供一个例子或链接@Xetius吗?尽管steve首先提供了答案,但还是将此标记为答案-因为这扩展了覆盖的方法-谢谢Andre