我有一个带有一些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");
- 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> {
}
请注意,当我只是运行应用程序并手动发送完全相同的查询时,一切都工作正常!
1条答案
按热度按时间bz4sfanl1#
我不知道
HttpGraphQlTester
,但我假设它会生成请求,然后在单独的线程中处理这些请求。该线程不会看到测试中所做的更改,因为这些更改尚未提交。
如果这是原因,请通过将设置放在其自己的事务中来解决它,例如使用
TransactionTemplate
。