【问题标题】:Snapshot testing in Spring MVC testSpring MVC 测试中的快照测试
【发布时间】:2019-10-25 15:56:09
【问题描述】:

在 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


    【解决方案1】:

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

    使用 Java 进行快照测试:

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

    现实世界的例子:

    我想测试一个转换器,它将行星转换为 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());
        }
    }
    

    【讨论】:

    • 谢谢,我知道 java-snapshot-matcher。我正在寻找对 MockMvc 具有一流支持的东西。
    猜你喜欢
    • 2021-07-13
    • 1970-01-01
    • 2020-01-29
    • 2017-10-01
    • 2021-10-05
    • 2019-07-13
    • 1970-01-01
    • 2013-07-21
    • 1970-01-01
    相关资源
    最近更新 更多