繁体   English   中英

Spring 引导测试:为每个单元测试注入不同的资源

[英]Spring Boot Test: Inject different Resources for each unit tests

我创建了一个带有@SpringBootTest 注释的 class 来测试 REST 端点的 HTTP 响应。

我将每个 HTTP JSON 响应与资源的内容进行比较。

@AutoConfigureMockMvc
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class SampleApplicationTests {

  @Autowired
  private MockMvc mockMvc;

  @Value("classpath:data/result1.json")
  private Resource result1;

  @Value("classpath:data/result2.json")
  private Resource result2;

  @Test
  public void test1() {
    mockMvc.perform(MockMvcRequestBuilders.
        get("/api/persons")).
        andExpect(MockMvcResutMatchers.status().isOk()).
        andExpect(MockMvcResutMatchers.content().json(asString(result1)));    
  }

  @Test
  public void test2() {
    mockMvc.perform(MockMvcRequestBuilders.
        get("/api/persons/1")).
        andExpect(MockMvcResutMatchers.status().isOk()).
        andExpect(MockMvcResutMatchers.content().json(asString(result2)));
  }

  ...

  private static String asString(Resource resource) {
    try {
      return IOUtils.toString(resource.getInputStream());
    } catch (IOException e) {
      throw new IllegalArgumentException(e);
    }
  }
}

我想知道是否有更优雅的方式在每个测试级别注入资源。

我知道我可以使用ResourceLoader为每个测试加载资源:

@AutoConfigureMockMvc
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class SampleApplicationTests {

  @Autowired
  private ResourceLoader resourceLoader = null;

  @Test
  public void test1() {
    String result = asString(resourceLoader.getResource("classpath:data/result1.json");

    mockMvc.perform(MockMvcRequestBuilders.
        get("/api/persons")).
        andExpect(MockMvcResutMatchers.status().isOk()).
        andExpect(MockMvcResutMatchers.content().json(result));
  }
  ...
}

但我想知道是否有允许为每个测试加载资源的注释。 类似于以下内容:

@AutoConfigureMockMvc
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class SampleApplicationTests {

  @Test
  @TestResource("classpath:data/result1.json")
  public void test1(Resource result) {
    mockMvc.perform(MockMvcRequestBuilders.
        get("/api/persons")).
        andExpect(MockMvcResutMatchers.status().isOk()).
        andExpect(MockMvcResutMatchers.content().json(result));
  }
  ...
}

有没有人有什么建议?

SpringBootTest使用@SpringExtension注释,它也解析 arguments 的方法参数:

  @Test
  public void test1(@Value("classpath:data/result1.json") Resource result1) {
    // ...
  }

  @Test
  public void test2(@Value("classpath:data/result2.json") Resource result2) {
    // ...
  }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM