Spring Boot 在@BeforeAll静态方法中使用MockMvc

jaxagkaj  于 2022-11-23  发布在  Spring
关注(0)|答案(2)|浏览(243)

我正在编写一些集成测试,在这些测试中,我需要发送一个api调用来创建一个资源,然后基于该资源执行后续的api调用。
在我的测试类中:

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
@ActiveProfiles("test")
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public class ExampleResourceTest {

    @Autowired
    private MockMvc mockMvc;

    @BeforeAll
    private void createExampleResource() throws Exception {
        Map<String, Object> requestBody = new HashMap<>();

        requestBody.put("email", "example@email.com");
        requestBody.put("username", "example");
        requestBody.put("firstName", "Example");
        requestBody.put("lastName", "Name");
        requestBody.put("password", "@password123");

        Gson gson = new Gson();

        String json = gson.toJson(requestBody);

        mockMvc.perform(
                    post("/api/v1/resourcename")
                            .contentType(MediaType.APPLICATION_JSON)
                            .content(json));
    }

    // More stuff...
}

但是,在运行类中的测试之前,没有调用标注为@BeforeAll方法的方法。
正如我在尝试寻找解决方案时所理解的那样,@BeforeAll方法需要是静态的。然而,这样我就不能使用我注入的MockMvc。我也尝试过用@TestInstance(TestInstance.Lifecycle.PER_CLASS)注解我的测试类,但我也没有遇到任何运气。

kmbjn2e3

kmbjn2e31#

我认为@BeforeAll不应该是私有的,但你已经添加了它。这就是它不调用你的方法的原因。
参考:https://junit.org/junit5/docs/5.0.0/api/org/junit/jupiter/api/BeforeAll.html

6ljaweal

6ljaweal2#

结果发现我在junit 4上,需要使用@BeforeClass才能调用它,最后我使用了一个@Before方法,并使用一个布尔值来检查是否已经进行了调用。

相关问题