postgresql 为什么我的数据在使用HTTPGraphQLTester和TestEntityManager的Spring-Boot集成测试中不能持久化/访问

huwehgph  于 2022-11-23  发布在  PostgreSQL
关注(0)|答案(1)|浏览(118)

我有一个带有一些GraphQL端点和Postgres数据库的Spring-Boot应用程序,我想对一个端点运行集成测试。当我通过Postman手动发送请求时,它应该通过ID找到一个实体,并且没有问题。但是当我为控制器编写集成测试时,它没有。数据似乎在使用TestEntityManager后保存了(或者直接访问JpaRepository),然后我用它的ID取回实体。然后我用HttpGraphQlTester将该ID粘贴到一个查询中,该查询失败,返回空结果/null。我用调试器跟踪它,发现当端点调用存储库以检索具有给定ID的实体时,它会返回null,或者当我查看所有存储库内容时,它会返回null。这只是一个空列表。所以我的数据似乎可以在我的测试中访问,但不能在我的repo/service中访问。任何指针都将非常感谢。
测试

@SpringBootTest
@AutoConfigureHttpGraphQlTester
@AutoConfigureTestEntityManager
@Transactional
public class BackboneTreeControllerTest {

  @Autowired
  HttpGraphQlTester tester;

  @Autowired
  private TestEntityManager testEntityManager;

  @Test
  void findTaxon() {
    Taxon taxon = Taxon.builder()
      .path(Arrays.asList("path", "to", "taxon"))
      .nameCanonical("Cocos nucifera")
      .authorship("Me")
      .extinct(false)
      .numDescendants(1l)
      .numOccurrences(1l)
      .build();

    Taxon savedTaxon = testEntityManager.persistFlushFind(taxon); // (1)

    this.tester.documentName("queries")
      .operationName("FindTaxon")
      .variable("taxonId", savedTaxon.getId())
      .execute()
      .path("findTaxon.authorship")
      .entity(String.class)
      .isEqualTo("Me");
  1. testEntityManager成功返回一个ID。

查询

query FindTaxon($taxonId: ID!) {
    findTaxon(id: $taxonId) {
        authorship
    }
}

控制器

@Controller
@AllArgsConstructor
public class BackboneTreeController {

  private final TaxonService taxonService;

  @QueryMapping
  public Taxon findTaxon(@Argument Integer id) {
    Optional<Taxon> taxon = taxonService.findTaxon(id);
    return taxon.orElse(null);
  }

}

服务

@Service
@AllArgsConstructor
public class TaxonService {

  private final TaxonRepository taxonRepository;

  public Optional<Taxon> findTaxon(Integer id) {
    return taxonRepository.findById(id); // (2)
  }
}

1.这是我希望repo返回实体的地方,但它没有。同样,在这里使用.findAll返回一个空列表。

存储库

@Repository
public interface TaxonRepository extends JpaRepository<Taxon, Integer> {
}

请注意,当我只是运行应用程序并手动发送完全相同的查询时,一切都工作正常!

bz4sfanl

bz4sfanl1#

我不知道HttpGraphQlTester,但我假设它会生成请求,然后在单独的线程中处理这些请求。
该线程不会看到测试中所做的更改,因为这些更改尚未提交。
如果这是原因,请通过将设置放在其自己的事务中来解决它,例如使用TransactionTemplate

相关问题