Spring Junit
- 随着Spring开发的深入,我们逐渐打算使用Spring-test与Junit结合进行开发测试
1. Jar形式的Maven依赖
1 2 3 4 5 6 7 8 9 10 11
| <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>4.0.6.RELEASE</version> </dependency>
|
2. 用来加载的Spring的上下文环境
1 2 3 4 5 6 7 8 9 10 11 12
| @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class BaseTest { protected MockMvc mockMvc; @Autowired protected WebApplicationContext wac; @Before() public void setup() { mockMvc = MockMvcBuilders.webAppContextSetup(wac).build(); } }
|
3. 正常的测试类的形式和实现
- 继承自BaseTest,然后进行正常的测试
3.1. 非Controller部分的测试检测
- 直接使用@AutoWired来自动装载对应测试部分
3.2. Controller部分的测试
- 我们使用MockMvc来完成
- 加载参数可以
- 通过JSON格式转换(使用.content(string))方法完成
- 通过param来一个一个处理。
1 2 3 4 5 6 7 8 9 10 11 12 13
| @RunWith(SpringJUnit4ClassRunner.class) @WebAppConfiguration @ContextConfiguration({"classpath*:/beans.xml","classpath*:/spring-mvc.xml"})
@TransactionConfiguration(defaultRollback = true) @Transactional public class TestController extends BaseTest{ @Test public void testLogin() throws Exception { mockMvc.perform((post("/loginTest").param("userName", "admin").param("password", "1"))).andExpect(status().isOk()).andDo(print()); } }
|
4. Junit中出现的问题汇总
4.1. @Before 和 @After 注解部分不执行
1 2 3 4 5 6 7 8 9 10 11 12 13
| @Before public void init() { System.out.println("init"); } @After public void destroy(){ System.err.println("destroy"); } @Test public void test() { System.out.println("test"); }
|
- 在正常执行的时候,并没有执行@Before和@After的代码
- 在Junit5 中已经不存在@Before和@After注释的方法,对应的方法为 @BeforeEach 和 @AfterEach。
4.2. 总结对比@Before,@BeforeClass,@BeforeEach,@BeforeAll
特性 |
Junit4 |
Junit5 |
1. 在当前类的所有测试方法之前执行。 2. 注解在静态方法上。 3. 此方法可以包含一些初始化代码。 |
@BeforeClass |
@BeforeAll |
1. 在当前类中的所有测试方法之后执行。 2. 注解在静态方法上。 3. 此方法可以包含一些清理代码。 |
@AfterClass |
@AfterAll |
1. 在每个测试方法之前执行。 2. 注解在非静态方法上。 3. 可以重新初始化测试方法所需要使用的类的某些属性。 |
@Before |
@BeforeEach |
1. 在每个测试方法之后执行。 2. 注解在非静态方法上。 3. 可以回滚测试方法引起的数据库修改。 |
@After |
@AfterEach |
5. 使用Mock完成单元测试
参见参考3
6. 相关代码参考
https://github.com/spricoder/TestDemo
7. 参考
- JUnit5 @Before @After 注解部分不执行
- @Before, @BeforeClass, @BeforeEach 和 @BeforeAll之间的不同
- 教你使用Mock完成单元测试