在通用响应体上进行断言
如何对带有 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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。