public <Class> getClassbyName(String name) {
private DSLContext context;
return context.selectFrom(Table)
.where(Table.NAME.equal(name))
.fetchOneInto(Class.class);
}
我有这种功能。我需要在jooq中为这个select查询编写一个单元测试。有人知道吗?
1条答案
按热度按时间oaxa6hgo1#
测试方法的客户端
如果您想测试该方法调用方的逻辑,可以使用类似mockito的第三方库来模拟该方法。这将允许您生成一组预期的
Class
返回一组已知输入的值String name
价值观。您还可以按如下所示对所有适用于整个应用程序的内容进行集成测试。
您可以尝试模仿jooq本身(jooq提供了这样的工具),但我强烈建议您不要这样做。迟早,您将实现一个完整的rdbms。
测试查询的正确性
如果您想确保您的查询本身是正确的,并且不会产生不需要的笛卡尔积或
null
值等。您应该运行集成测试。理想情况下,集成测试尽可能接近生产环境。例如,如果您使用的是postgresql,那么您应该在具有已知数据集的实际postgresql示例上运行此查询。运行此类测试的一个很好的实用工具是testcontainers,但是也有其他方法可以针对实际的数据库示例自动化测试。
一种不太推荐的方法(但是如果您的查询很简单的话,可能会更快更方便)是在内存中的数据库(比如h2)上运行集成测试。速度更快,但价格很高:
您不能再使用生产数据库产品的特定于供应商的功能
您必须将数据库模式调整为生产数据库和测试数据库之间支持的最小公分母,例如数据类型等。
但是,如果您的应用程序支持多个生产数据库产品,那么这是一个可行的选择,在这种情况下,上述两个注意事项仍然是您在生产中遇到的问题。
不过,对于大多数测试,我仍然使用testcontainer。