如果使用 Spring 和 Junit 4,如何编写内部测试类?或者我还能如何构建我的测试?
Posted
技术标签:
【中文标题】如果使用 Spring 和 Junit 4,如何编写内部测试类?或者我还能如何构建我的测试?【英文标题】:How to write inner test classes if you use Spring and Junit 4? Or How else I can structure my tests? 【发布时间】:2019-07-29 09:44:12 【问题描述】:我有一个测试类,将来会测试不同的测试条件,我想让它更有条理,只适合一个文件。我找到了this 解决方案,但它不适合我,因为我无法将SpringRunner.class
和Enclosed.class
组合成一个@RunWith
。我不能使用Nitor Creation's Nested Runner
- 它带来了同样的问题。
我使用Spring 5
和Junit 4.12
。嗯...我的问题是,如何将我的测试与几个内部/嵌套类与一个根类结合起来?
UPD:一句话 - 我无法升级到Junit 5
。
【问题讨论】:
【参考方案1】:JUnit 4
如果您需要坚持使用 JUnit 4,您可以使用第三方插件来提供支持。请参阅 GitHub 上bechte
提供的junit-hierarchicalcontextrunner。
将依赖项添加到您的项目中,并像这样使用HeirachalContextRunner
:
@RunWith(HierarchicalContextRunner.class)
public class NestedTest
@ClassRule
public static final SpringClassRule SPRING_CLASS_RULE = new SpringClassRule();
@Rule
public final SpringMethodRule springMethodRule = new SpringMethodRule();
@Before
public void setup()
// General test-suite setup
public class NestedClass
@Test
public void testSomething()
// Test
public class AnotherNestedClass
@Test
public void testSomethingElse()
// Test
请注意,我们不需要在此处指定 Spring 的运行器。相反,我们使用这些规则来应用 Spring 测试框架,从 Spring 4.2
开始可用。
JUnit 5
可以说,升级到JUnit 5
是一种更具前瞻性的解决方案。然后,您可以使用@Nested
注释直接构建测试用例。见下文:
@SpringBootTest
@ExtendWith(SpringExtension.class)
class MyNestedTest
@BeforeAll
void setup()
// General test-suite setup
@Nested
@DisplayName("parentTestSuite")
class NestedClass
@Test
void testSomething()
// Test
@Nested
@DisplayName("childTestSuite")
class AnotherNestedClass
@Test
void testSomethingElse()
// Test
请注意,@RunWith
已在 JUnit 5
中替换为 @ExtendWith
。如果您选择迁移到 JUnit 5,您可能会发现阅读 Baeldung's guide on JUnit 5 migration 很有用。
【讨论】:
我无法升级到 Junit 5,我应该给它贴上标签。我喜欢这个解决方案,我会记住它。谢谢) @Woods 理解 - 请参阅我最近使用第三方库对 JUnit 4 兼容解决方案进行的编辑。 @Woods 需要注意的重要一点是,如果将SpringRunner
替换为 Spring 的 JUnit 规则(在版本 4.2
中引入),则可以使用另一个跑步者。以上是关于如果使用 Spring 和 Junit 4,如何编写内部测试类?或者我还能如何构建我的测试?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Spring Boot 和 JUnit 测试中定义 spring.config.location?
Spring MVC 和 Hibernate 使用 Junit 测试 DAO 层和 Service 层的步骤