如何在 Spring Boot 测试中插入高级数据?

发布于 2025-01-13 13:04:38 字数 2117 浏览 4 评论 0原文

我正在 Spring Boot 中编写测试代码。

但是,我的测试代码没有使用 @Before 方法保存数据。

如果我请求“/v1/stay/”,它会返回空数组...

请您解释一下我的代码有什么问题吗?

这是我的测试代码。

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class StayControllerTest {
  @MockBean
  private StayService stayService;
  @Autowired
  private MockMvc mockMvc;

  // givenStay method is the method generating dummy data
  @Before
  public void before() {
    stayService.save(givenStay1());
    stayService.save(givenStay2());
    stayService.save(givenStay3());
    stayService.save(givenStay4());
    stayService.save(givenStay5());
  }

    @Test
  @Transactional
  void showStayList() throws Exception {

    List<StayReq> original = new ArrayList<>();
    original.add(givenStay1());
    original.add(givenStay2());
    original.add(givenStay3());
    original.add(givenStay4());
    original.add(givenStay5());

    MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get("/v1/stay")
            .contentType(MediaType.APPLICATION_JSON))
            .andExpect(status().isOk())
            .andDo(print())
            .andReturn();

    System.out.println(result.getResponse());
  }
}

下面的代码块是我的 StayController 和 StayService

@RestController
@ApiV1
@RequiredArgsConstructor
public class StayController {
  private final StayService stayService;
  private final ApiService apiService;

  @GetMapping("/stay")
  public ResponseEntity<Response> stayList() {
    return apiService.okResponse(stayService.getList());
  }
}
@Service
@RequiredArgsConstructor
public class StayService {
  private final StayRepository stayRepository;
  private final RoomRepository roomRepository;

  public List<StayRes> getList() {
    return stayRepository.findAll().stream().map(StayRes::new).collect(Collectors.toList());
  }
  @Transactional
  public void save(StayReq stayReq) {
    stayRepository.save(stayReq.toEntity());
  }
}

I'm making test code in spring boot.

But, my test code doesn't save the data using @Before method.

If i request to '/v1/stay/, it return empty array...

Please can you explain what is wrong with my code?

Here is my test code.

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class StayControllerTest {
  @MockBean
  private StayService stayService;
  @Autowired
  private MockMvc mockMvc;

  // givenStay method is the method generating dummy data
  @Before
  public void before() {
    stayService.save(givenStay1());
    stayService.save(givenStay2());
    stayService.save(givenStay3());
    stayService.save(givenStay4());
    stayService.save(givenStay5());
  }

    @Test
  @Transactional
  void showStayList() throws Exception {

    List<StayReq> original = new ArrayList<>();
    original.add(givenStay1());
    original.add(givenStay2());
    original.add(givenStay3());
    original.add(givenStay4());
    original.add(givenStay5());

    MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get("/v1/stay")
            .contentType(MediaType.APPLICATION_JSON))
            .andExpect(status().isOk())
            .andDo(print())
            .andReturn();

    System.out.println(result.getResponse());
  }
}

And below code blocks are my StayController and StayService

@RestController
@ApiV1
@RequiredArgsConstructor
public class StayController {
  private final StayService stayService;
  private final ApiService apiService;

  @GetMapping("/stay")
  public ResponseEntity<Response> stayList() {
    return apiService.okResponse(stayService.getList());
  }
}
@Service
@RequiredArgsConstructor
public class StayService {
  private final StayRepository stayRepository;
  private final RoomRepository roomRepository;

  public List<StayRes> getList() {
    return stayRepository.findAll().stream().map(StayRes::new).collect(Collectors.toList());
  }
  @Transactional
  public void save(StayReq stayReq) {
    stayRepository.save(stayReq.toEntity());
  }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

迷荒 2025-01-20 13:04:38

您注入的是模拟服务,而不是“真正的”服务。如果您想使用“真实”服务 - 您需要将 @MockBean 注释替换为 @Autowired 注释。

或者 - 您可以在测试方法中配置模拟以返回一些预定义的数据。

You injected a mock, not a 'real' service. If you want to use a 'real' service - you need to replace @MockBean annotation with @Autowired annotation.

Or alternatively - you can configure mock in the test method to return some predefined data.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文