在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
进行比较。如果相同,则通过。否则就失败了。
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());
}
}
selfie是JVM上可用的快照测试库。