Java “课前”和“课前”有什么意义?

Java “课前”和“课前”有什么意义?,java,junit,Java,Junit,与其使用这些JUnit4注释,为什么不使用静态和实例初始值设定项块呢?下面的代码显示每当静态初始值设定项块运行时@BeforeClass方法就会运行,而每当实例初始值设定项块运行时@BeforeClass方法就会运行。那么我们为什么需要它们呢 public class DemoTest { static { System.out.println("init static"); } { System.out.println("init i

与其使用这些JUnit4注释,为什么不使用静态和实例初始值设定项块呢?下面的代码显示每当静态初始值设定项块运行时@BeforeClass方法就会运行,而每当实例初始值设定项块运行时@BeforeClass方法就会运行。那么我们为什么需要它们呢

public class DemoTest {

    static {
        System.out.println("init static");
    }

    {
        System.out.println("init instance");
    }

    @BeforeClass
    public static void setUpAll() {
        System.out.println("beforeClass");
    }

    @Before
    public void setUp() {
        System.out.println("before");
    }

    @Test
    public void test1() {
        System.out.println("test1");
    }

    @Test
    public void test2() {
        System.out.println("test2");
    }
}

如果您的测试用例不需要@Before等提供的附加功能,那么您当然可以自由使用这些功能

但是,由于不能使用这些构造来完成与@After和@AfterClass相同的工作,因此以相同的格式包含它们对于对称性、可重用性和可读性来说是有意义的


此外,对于@Rule和@ClassRule注释字段以及@Mock注释字段(如果您使用的是MockitoJUnit4Runner)或@Autowired(如果您使用的是SpringJUnitRunner),这些字段保证在您在JUnit中输入适当的@Before等方法时已初始化。事实上,没有这样的保证,如果您使用的是静态/实例初始化器块,则可以保证它们不会出现。

如果您的测试用例不需要@Before等提供的附加功能,则您当然可以自由使用它们

但是,由于不能使用这些构造来完成与@After和@AfterClass相同的工作,因此以相同的格式包含它们对于对称性、可重用性和可读性来说是有意义的

此外,对于@Rule和@ClassRule注释字段以及@Mock注释字段(如果您使用的是MockitoJUnit4Runner)或@Autowired(如果您使用的是SpringJUnitRunner),这些字段保证在您在JUnit中输入适当的@Before等方法时已初始化。事实上,没有这样的保证,如果您使用静态/实例初始化器块,则可以保证它们不会出现; 注释说明中包含每个注释背后的推理

直接从JUnit JavaDocs开始:

因为@之前

编写测试时,通常会发现一些测试在运行之前需要创建类似的对象。用@Before注释公共void方法会导致该方法在测试方法之前运行。超类的@Before方法将在当前类的方法之前运行,除非它们在当前类中被重写。没有定义其他顺序

对于@BeforeClass

有时,一些测试需要共享昂贵的计算设置,比如登录数据库。虽然这可能会损害测试的独立性,但有时这是一种必要的优化。用@BeforeClass注释公共静态void no arg方法会导致它在类中的任何测试方法之前运行一次。超类的@BeforeClass方法将在当前类的方法之前运行,除非它们在当前类中被隐藏

这里是一个链接到; 注释说明中包含每个注释背后的推理

直接从JUnit JavaDocs开始:

因为@之前

编写测试时,通常会发现一些测试在运行之前需要创建类似的对象。用@Before注释公共void方法会导致该方法在测试方法之前运行。超类的@Before方法将在当前类的方法之前运行,除非它们在当前类中被重写。没有定义其他顺序

对于@BeforeClass

有时,一些测试需要共享昂贵的计算设置,比如登录数据库。虽然这可能会损害测试的独立性,但有时这是一种必要的优化。用@BeforeClass注释公共静态void no arg方法会导致它在类中的任何测试方法之前运行一次。超类的@BeforeClass方法将在当前类的方法之前运行,除非它们在当前类中被隐藏


首先也是最重要的是启用声明式编程;使用注释正是在JUnit中处理事情的方式,因此在这里使用这些构造也是有意义的


注意:这也是为了对称。你有@After和@AfterClass,你真的不能用类中的静态代码块来表达它们

首先启用声明式编程;使用注释正是在JUnit中处理事情的方式,因此在这里使用这些构造也是有意义的

注意:这也是为了对称。你有@After和@AfterClass,你真的不能用类中的静态代码块来表达它们

@每当静态初始值设定项块运行时,BeforeClass方法就会运行

这里的重要警告是,这种说法是错误的。静态初始值设定项块在加载类时运行,这不一定是在您打算执行测试时运行

将@BeforeClass移动到静态init块意味着每次类加载只调用一次,这意味着您不能再调用它了 er在不首先重新加载类的情况下多次执行测试,这是一件棘手的事情

还需要注意的是,@BeforeClass并不意味着准备您的测试类以供使用-它们意味着为运行测试准备系统的其余部分-因此,通常每个@BeforeClass和@Before都需要分别用适当的@AfterClass和@After进行补充,以便在所有测试运行之后,系统已清理

@每当静态初始值设定项块运行时,BeforeClass方法就会运行

这里的重要警告是,这种说法是错误的。静态初始值设定项块在加载类时运行,这不一定是在您打算执行测试时运行

将@BeforeClass移动到静态init块意味着每次类加载只调用一次,这意味着如果不先重新加载类,就无法多次执行测试,这是一件棘手的事情


还需要注意的是,@BeforeClass并不意味着准备您的测试类以供使用-它们意味着为运行测试准备系统的其余部分-因此,通常每个@BeforeClass和@Before都需要分别用适当的@AfterClass和@After进行补充,以便在所有测试运行之后,系统已清理。

@在每次实例初始值设定项块运行时,方法都会运行之前-但不是相反。我不相信当前的测试引擎会为每个测试真正创建一个新实例。因此,当测试失败时,您必须调试测试引擎,我认为您不想这样做。@在实例初始值设定项块运行时方法运行之前-但不是相反。我不相信当前测试引擎会为每个测试创建一个新实例。因此,当测试失败时,您必须调试测试引擎,我认为您不想这样做。谢谢,但我不知道这如何回答我的问题。我在问题初始值设定项块中提到的备选方案也与Javadoc描述的一样。但没关系,我对其他答案很满意。谢谢,但我不知道这是如何回答我的问题的。我在问题初始值设定项块中提到的备选方案也与Javadoc描述的一样。但没关系,我对其他答案很满意。您提到的两个跑步者都有各自的规则,允许您使用库功能,而不必使用跑步者本身-您可以在任意范围内拥有任意数量的规则,但您只能拥有一个跑步者,曾经。您提到的两个运行程序都有各自的规则,允许您使用库功能而不必使用运行程序本身-您可以在任何范围内拥有任意数量的规则,但您只能拥有一个运行程序。