在通用响应体上进行断言

后端开发 2026-07-09

如何对带有 MockMvcTester 的JSON对象列表进行断言?

我想把它干净地映射到 List<MyDto> 并对该列表进行断言。

import com.example.em_card_service.data.dto.response.CardResponseDto;
import com.example.em_card_service.service.CardService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest;
import org.springframework.test.context.bean.override.mockito.MockitoBean;
import org.springframework.test.web.servlet.assertj.MockMvcTester;

import java.util.List;
import java.util.UUID;

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.BDDMockito.given;

@WebMvcTest(CardController.class)
class CardControllerTest {

    @Autowired
    MockMvcTester mvcTester;
    @MockitoBean
    CardService cardService;

    @Test
    void findAll_givenCardsPresent_returns200_andExpectedDtos() {
        UUID cardId = UUID.randomUUID();
        String number = "**** **** **** 1234";
        CardResponseDto card = CardResponseDto.builder().id(cardId).number(number).build();
        List<CardResponseDto> cards = List.of(card);
        given(cardService.findAll(any())).willReturn(cards);

        assertThat(mvcTester.get().uri("/api/admin/cards").exchange())
                .hasStatusOk()
                .bodyJson().convertTo(List.class)
                .satisfies(c -> {
                    assertThat(c).hasSize(1);
                    // unchecked warning, besides it doesn't work: the list has LinkedHashMap, not my DTO
                    assertThat(c).containsExactlyElementsOf(cards);
                });
    }
}

Spring Boot 4.

解决方案

你可以使用 InstanceOfAssertFactories.list(Class)convertTo(AssertFactory) 的重载,让AssertJ知道应该将哪种元素类型视为要考虑的类型,例如:

assertThat(mvcTester.get().uri("/api/admin/cards").exchange())
        .hasStatusOk()
        .bodyJson().convertTo(list(CardResponseDto.class))
        .hasSize(1)
        .containsExactlyElementsOf(cards);
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章