从 JpaRepository 获取数据时,未从 WebTestClient 接收到任何数据

No data received from WebTestClient when getting data from JpaRepository

提问人:Steven Kristian 提问时间:11/15/2023 最后编辑:Steven Kristian 更新时间:11/15/2023 访问量:20

问:

我有一个简单的集成测试用例,我想在其中查找某个数据。 首先,我使用 .save() 插入数据。虽然它工作成功(因为我调试了它,并且 this.dataRepository.findAll() 不返回 null),但是当我使用 WebTestClient 使用相同的方法(this.dataRepository.findAll())获取特定数据时,它返回 null

@RequestMapping(value = "/api/constant")
public class ConfigurationController {

  @Autowired
  private DataRepository dataRepository;

  @GetMapping
  public Mono<Object> getConstant() {
    Mono.fromSupplier(() -> this.dataRepository.findAll()).subscribeOn(Schedulers.single());
  }
}
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK)
@AutoConfigureWebTestClient
@Transactional
public class TestITCase {

  @Autowired
  private DataRepository dataRepository;

  @Autowired
  private WebTestClient webTestClient;

  @Test
  public void getConstants_Valid_Success()  {
    this.dataRepository.saveAndFlush(data);
    this.dataRepository.findAll(); // the data exist
    FluxExchangeResult<String> result = this.webTestClient.get()
        .uri(b -> b.path("/api/constant")
            .build())
        .header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE)
        .exchange()
        .returnResult(String.class)
        .getResponseBody()
        .blockFirst(); // this returns null for some reason
  }
}

更新

显然,在使用 WebTestClient 时,

此请求在不同的线程中处理,因此使用新事务。存储库插入在SpringBootTest和WebTestClient中不起作用

但是现在我想知道有没有办法让 WebTestClient 在同一线程上运行?因为我不想提交事务然后回滚它,因为它不会在我的测试中创建幂等性(例如,测试在 .delete() 之前失败),所以数据被意外保存。

java spring-boot spring-webflux spring-test

评论

1赞 M. Deinum 11/15/2023
数据不会被保存,它只对当前线程/事务可见。由于 Web 客户端是异步的,因此在运行不同的事务时,它无法看到未提交的数据。

答: 暂无答案