石英集成测试和事务



我尝试在Quartz调度器上创建集成测试。

我有两个表:events. 调度程序创建任务通过事件

@SneakyThrows
@Test
public void taskGenerationBeanTest() {
RequestData request = requestBuilder(str(), str(), str()).build();
String orderId = String.valueOf(UUID.randomUUID());
Event event1 = getEvent("type1", request, orderId);
Event event2 = getEvent("type2", request, orderId);
eventRepository.save(event1);
eventRepository.save(event2);
Thread.sleep(20000);
List<Event> events = eventRepository.findAll();
Thread.sleep(1000);
List<Task> actual = taskRepository.findAll();
assertAll(
() -> assertEquals(2, actual.size()),
() -> assertTrue(actual.stream().anyMatch(t ->
"type1".equals(t.getEvent().getEventType()))),
() -> assertEquals(event1.getOrderId(), actual.get(0).getEvent().getOrderId())
);
}

首先,我得到异常:

无法初始化代理- no Session

我使用这个答案Spring Data JPA -"无法初始化代理-没有会话";-将Methods标记为事务性并添加spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true到我的测试配置。所以现在我有另一个问题-我的测试有时工作正确,但更多时候它失败,因为它只创建了1个任务.

方法,由Quartz执行:

@Override
@Transactional(isolation = Isolation.REPEATABLE_READ)
public int createAndSaveTasks(EventType eventType) {
List<Task> tasks = eventService.getEvent(eventType)
.stream()
.map(Task::new)
.collect(Collectors.toList());
taskRepository.saveAll(tasks);
return tasks.size();
}

那么如何正确地使用Quarts和事务创建集成测试呢?

测试类使用存储库的findAll方法,如果您试图获得LAZY初始化方法,您可能会得到此异常。

在断言中:

t.getEvent().getEventType() // can throw it
actual.get(0).getEvent() // can throw it

为了避免这种情况,您可以将其设置为事务性的,或者可以选择急切获取类型。

在REPEATABLE READ下,第二次SELECT保证至少显示从第一次SELECT返回的未改变的行。在这一分钟内,并发事务可以添加新的行,但是不能删除或修改现有的行。

read committed &;可重复阅读

最新更新