当前位置: 首页 > 知识库问答 >
问题:

石英集成测试和交易

易星纬
2023-03-14

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

我有两个表:事件和任务。调度程序通过cron触发器按事件创建任务。

@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())
    );
}

首先,我得到例外:

无法初始化代理-没有会话

我在Spring Data JPA中使用这个答案-“无法初始化代理-没有会话”-方法标记为事务性,并添加Spring.JPA.properties.hibernate。enable_lazy_load_no_trans=true到我的测试配置。所以现在我又遇到了另一个问题——我的测试有时是正确的,但更常见的是它失败了,因为它只创建了一个任务。

由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();
}

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

共有1个答案

秦凯定
2023-03-14

测试类使用存储库的findAll方法,如果你试图得到懒惰的初始化方法,你会得到这个异常。

在断言中:

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

为了避免它,也许您可以将其设为事务性或急切获取类型。

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

“已提交读取”和“可重复读取”之间的差异

 类似资料:
  • 问题内容: 我尝试对Apache骆驼路线进行junit测试。像这样的东西: 构建器类的定义如下 “ myExportRouteProcessor”类仅从JPA存储库中获取一些数据,并将结果放入路由。我想要的是在测试类中触发此路由,以检查整个过程是否正确完成。当前,处理器未启动。我该怎么办? 问题答案: 您可以使用AdviceWithRouteBuilder#replaceFromWith直接替换测

  • 我试着为阿帕奇骆驼路线做一个jUnit测试。类似于这样: builder类的定义如下 myExportRouteProcencer类只是从JPA存储库中获取一些数据,并将结果放入路由。我想要的是在测试类中触发此路由,以检查整个过程是否正确完成。目前,处理器没有被触发。我应该做些什么?

  • 如何禁用Quartz日志记录?Quartz正在我的控制台上打印INFO语句。我试图用log4j中的以下语句禁用它。属性文件

  • 问题内容: 有没有办法将石英作为基础调度程序? 我可以想到两件事,但都需要做一些工作: 创建一个将解析注解并注册石英作业的自定义 实施委托石英的工具。 问题是:以上两个选项是否已经编写过,是否还有另一个选项? 问题答案: 我最终制作了自己的弹簧石英“桥”。我打算建议将其作为春季的改进。 首先,我创建了一个新注释,该注释将放置在实现quartz Job接口的类上: (请注意原型作用域-石英假定每个作

  • 谢谢你的帮助!

  • 单元测试 单元测试仅依赖于源代码,是测试代码逻辑是否符合预期的最简单方法。 运行所有的单元测试 make test 仅测试指定的package # 单个package make test WHAT=./pkg/api # 多个packages make test WHAT=./pkg/{api,kubelet} 或者,也可以直接用go test go test -v k8s.io/kubernet