Spring MVC 测试中的快照测试

问题描述 投票:0回答:2

在Spring MVC测试(MockMvc)中是否有任何现有的解决方案可以进行快照测试[1]?

类似:

this.mockMvc.perform(get("/users")
  .andExpect(status().isOk())
  .andExpect(content().contentType("application/json"))
  .andExpect(matchesSnapshot("__snapshots__/users/list.json"));

第一次运行此测试将使测试通过并将响应内容写入

src/main/resources/__snapshots__/users/list.json

第二次运行此测试会将响应内容与

src/main/resources/__snapshots__/users/list.json
进行比较。如果相同,则通过。否则就失败了。

[1] https://jestjs.io/docs/en/snapshot-testing

spring spring-mvc spring-test spring-test-mvc spring-mvc-test
2个回答
0
投票

https://github.com/Zenika/java-snapshot-matcher

使用 Java 进行快照测试:

我们使用 Jackson 来处理 JSON 格式的序列化/反序列化。因此,该库可以处理可由 Jackson 序列化的任何对象。

现实世界的例子:

我想测试一个转换器,它将 Planet 转换为 PlanetDTO。

@Component
public class PlanetConverter {

    @Autowired
    private ObjectMapper objectMapper;

    @Autowired
    private RestTemplate restTemplate;

    public PlanetDTO convertPlanet(Planet planet) {
        PlanetDTO dto = objectMapper.convertValue(planet, PlanetDTO.class);

        dto.films = planet.filmsUrls.stream()
                .map(filmUrl -> restTemplate.getForObject(filmUrl, FilmDTO.class))
                .collect(Collectors.toList());

        dto.residents = planet.residentsUrls.stream()
                .map(filmUrl -> restTemplate.getForObject(filmUrl, PeopleDTO.class))
                .collect(Collectors.toList());

        return dto;
    }
}

由于生成输入对象并对返回对象执行断言可能很困难,因此我们使用快照匹配器来处理断言。

@RunWith(SpringRunner.class)
@SpringBootTest
public class PlanetConverterTest {

    // RestTemplate needs to be mocked to ensure stability of snapshots.
    // Note that ObjectMapper is not mocked
    @Mock
    private RestTemplate restTemplate;

    @Autowired
    @InjectMocks
    private PlanetConverter converter;

    // Create input objects from JSON files
    private PeopleDTO lukeSkywalker = fromJson("luke-skywalker", PeopleDTO.class);
    private FilmDTO attackOfTheClones = fromJson("attack-of-the-clones", FilmDTO.class);
    private Planet tatooine = fromJson("tatooine", Planet.class);

    @Before
    public void setUp() {
        // Mock return values of RestTemplate
        when(restTemplate.getForObject("https://swapi.co/api/people/1/", PeopleDTO.class))
                .thenReturn(lukeSkywalker);
        when(restTemplate.getForObject("https://swapi.co/api/films/5/", FilmDTO.class))
                .thenReturn(attackOfTheClones);
    }

    @Test
    public void converterTest() {
        // Call method
        PlanetDTO planet = converter.convertPlanet(tatooine);

        // Do assertion
        assertThat(planet, matchesSnapshot());
    }
}

0
投票

selfie是JVM上可用的快照测试库。

上面链接的故事示例使用 Jooby,但同样的事情也适用于 Spring - 轻松将 MockMVC 数据的不同方面放入不同的方面。

© www.soinside.com 2019 - 2024. All rights reserved.