MockMVC忽略@Order注解,测试方法执行顺序不符合预期
MockMVC测试中@Order注解未生效,测试方法按方法名字母顺序执行
MockMVC 忽略了@Order注解指定的执行顺序,转而按方法名的字母顺序执行测试。当第二个测试方法命名为test2_b时,它能按预期作为第二个方法执行,但将其重命名为test2后,尽管配置了@Order(2),该方法却成为最后一个执行的方法:
package com.javainuse.boot3security.test; import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.web.servlet.MockMvc; import com.javainuse.boot3security.repository.DadosPessoaisRepository; @SpringBootTest @AutoConfigureMockMvc class ClassTest { @Autowired MockMvc mockMvc; @MockBean private DadosPessoaisRepository dadosPessoaisRepository; @Order(1) @Test public void test1_a() throws Exception { System.out.println("Test1"); } @Order(2) @Test public void test2() throws Exception { System.out.println("Test2"); } @Order(3) @Test public void test3_c() throws Exception { System.out.println("Test3"); } @Order(4) @Test public void test4_d() throws Exception { System.out.println("Test4"); } }
执行输出:
Test1 Test3 Test4 Test2
问题原因与解决方案
原因
JUnit 5 默认不会通过@Order注解控制测试方法的执行顺序,默认策略是按方法名字典序执行,因此@Order注解会被忽略。
解决方案
在测试类上添加@TestMethodOrder(MethodOrderer.OrderAnnotation.class)注解,显式指定使用@Order注解控制执行顺序。
修复后的测试类代码:
package com.javainuse.boot3security.test; import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestMethodOrder; import org.junit.jupiter.api.MethodOrderer.OrderAnnotation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.web.servlet.MockMvc; import com.javainuse.boot3security.repository.DadosPessoaisRepository; @SpringBootTest @AutoConfigureMockMvc @TestMethodOrder(OrderAnnotation.class) // 新增注解,启用Order排序 class ClassTest { @Autowired MockMvc mockMvc; @MockBean private DadosPessoaisRepository dadosPessoaisRepository; @Order(1) @Test public void test1_a() throws Exception { System.out.println("Test1"); } @Order(2) @Test public void test2() throws Exception { System.out.println("Test2"); } @Order(3) @Test public void test3_c() throws Exception { System.out.println("Test3"); } @Order(4) @Test public void test4_d() throws Exception { System.out.println("Test4"); } }
添加该注解后,测试方法将严格按照@Order指定的顺序执行,输出结果会变为:
Test1 Test2 Test3 Test4
内容的提问来源于stack exchange,提问作者JamesB
相关产品推荐
相关产品推荐

