spring - 如何在不使用 @Transactional 的集成测试中解决惰性关联?
问题描述
我正在使用 Spring 进行一些集成测试,但是在断言之前需要解决惰性的某些实体的内容时,我试图简化我的生活。
我的测试是这样的:
@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_CLASS)
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class OrderIT {
@Autowired
private OrderService orderService;
@Autowired
private OrderRepository orderRepository;
@Test
public void test01CreateOrder() {
OrderDto orderDto = createSomeOrderDto();
orderService.create(orderDto);
Order order = orderRepository.findByNumber("123456");
// order asserts ...
}
}
之后,我们对使用此顺序的同一类进行测试(测试如更改顺序等)。这就是为什么我不使用@Transactional
测试方法并且按照订单名称执行集成测试的原因,因为我使用上一个测试作为下一个测试的基础。
这很好用。但我的问题是当我需要改进我的断言时,试图解决实体的一些惰性信息。
例如,我不能只order.getReponsable()
对我的测试进行 a,因为我会收到一个LazyException
错误。
什么有效(但我不喜欢它)
我发现在测试中这样做的唯一方法是在存储库上创建一个特定的查询来获取 this responsable
。我可以调用这个查询,懒惰的关联将不再是问题。但我不想仅仅为了测试目的而创建存储库方法。
我尝试过(但失败了)
TestEntityManager
我的想法是在我的集成测试中注入@AutoConfigureTestEntityManager
测试类,希望能够访问getEntityManager
,最后在测试中创建一个查询,如下所示:
Order order = (Order) testEntityManager.getEntityManager().createQuery("SELECT o FROM Order o JOIN FETCH o.responsable WHERE o.number = " + "123456").getSingleResult();
如果工作将是完美的。但 EntityManager 不可用:
> java.lang.IllegalStateException: No transactional EntityManager found
还有另一种选择吗?同样,@Transactional
测试方法对我来说不是一个选项。
解决方案
我刚刚找到了一个替代方案。我不知道春天是否提供更好的,但工作。
EntityManagerFactory
我只是在我的集成测试类中注入:
@Autowired
private EntityManagerFactory entityManagerFactory;
并使用实体管理器进行了查询,但我创建了一个:
Order order = (Order) entityManagerFactory.createEntityManager().createQuery("SELECT o FROM Order o JOIN FETCH o.responsable WHERE o.number = " + "123456").getSingleResult();
推荐阅读
- django - 将访问令牌存储在 httponly Cookie 中,但用户仍然可以在 Chrome 开发工具的网络选项卡中看到它?
- php - 与表中的列名对应的关联数组
- c# - 找到知道开始和结束的整个路径 C#
- python - 通过在 Ansible 中附加零来将一位数转换为两位数
- angular - 如何防止角度多次登录
- javascript - 基于预定列表自动填充为用户类型的文本区域
- javascript - 浏览器控制台中的 Javascript 在一项任务中运行以填充网页女巫中的公式,多次使用不同的帖子变量重新加载
- python - 我无法在 Django 框架中打开管理页面
- c++ - 当指数是整数时 pow(x,p) 更快吗?
- leaflet - react-leaflet 不加载瓷砖和镀金 403 请求错误