gpt4 book ai didi

java - JUnit 5 @Nested 注释的目的是什么

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:41:34 25 4
gpt4 key购买 nike

在 JUnit 5 中,有一个新的注解:@Nested .

我理解注解是如何工作的,我理解为什么我们使用嵌套类,我只是不明白为什么我们需要嵌套测试类。

最佳答案

I just don't understand why we need to have nested test class in our test.

@Nested 组织大型测试类非常有意义。

典型用例

很多时候,开发团队会逐个定义一个测试类来进行测试。这是一个共同的好习惯,但它也可能使您的测试类变得非常大并且有数百行。您确实可以使用多种方法测试类,每个类都有多个场景,以及单元测试方法中测试场景所需的一些初始化步骤。
所有这些都会自然地增加测试类的大小。
超过一个阈值(可能是 500 行左右),问问自己是否需要重构就变得合理了。

一个大类(无论是否为测试类),即使组织得很好,也比多个类将具有高内聚/关系的事物分组更难阅读、维护。
在单元测试用例中,有时情况会更糟,因为您可能找不到测试场景并在它存在时编写一个新场景,但由于测试类很大而没有设法找到它。

@Nested :解决方案

@Nested通过提供在主(外部)测试类的多个嵌套类中对多个测试方法进行分组的可能性来解决此问题。
主(外部)测试类中定义的所有嵌套类的测试方法都作为任何测试方法处理。所以@BeforeEach, @AfterEach, @ExtendWith...都被应用了。
The single exception is @BeforeAll and @AfterAll :

Only non-static nested classes (i.e. inner classes) can serve as @Nested test classes. Nesting can be arbitrarily deep, and those inner classes are considered to be full members of the test class family with one exception: @BeforeAll and @AfterAll methods do not work by default. The reason is that Java does not allow static members in inner classes. However, this restriction can be circumvented by annotating a @Nested test class with @TestInstance(Lifecycle.PER_CLASS) (see Test Instance Lifecycle).

使用 @Nested 结合 @DisplayName采用 String 值的显示名称将变得更精细,因为显示名称将用于 IDE 和构建工具中的测试报告,并且可能包含空格、特殊字符,甚至表情符号。

示例

我有一个具有多种方法和多种场景的 FooService。我可以在单元测试类的嵌套类中对相同关注点的场景进行分组。
在这里,我选择测试方法来对它们进行分组(因此我按场景分组),但如果有意义的话,鉴别器可能是另一回事。

例如:

public class FooServiceTest {

Foo foo;

// invoked for ALL test methods
@BeforeEach
public void beforeEach() {
Foo foo = new Foo(...);
}

@Nested
@DisplayName("findWith methods")
class FindMethods {
@Test
void findWith_when_X() throws Exception {
//...
foo.findWith(...);
//...
}
@Test
void findWith_when_Y() throws Exception {
//...
foo.findWith(...);
//...

}
@Test
void findWith_when_Z() throws Exception {
//...
foo.findWith(...);
//...
}
}

@Nested
@DisplayName("findAll methods")
class FindAllMethods {
@Test
void findAll_when_X() throws Exception {
//...
foo.findAll(...);
//...
}
@Test
void findAll_when_Y() throws Exception {
//...
foo.findAll(...);
//...

}
@Test
void findAll_when_Z() throws Exception {
//...
foo.findAll(...);
//...
}
}

@Nested
@DisplayName("computeBar methods")
class ComputeBarMethods {
//...

}

@Nested
@DisplayName("saveOrUpdate methods")
class SaveOrUpdateMethods {
//...

}
}

IDE 中的示例渲染

嵌套的子方法默认折叠:

Overview in JUnit Eclipse plugin

如果测试失败或需要,您可以展开 Nesteds 的子方法:

Unfold with a failure in JUnit Eclipse plugin

关于java - JUnit 5 @Nested 注释的目的是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36220889/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com