我想使用底层内存数据库为我的测试创建测试数据。 常见的方法是创建一些 test_data.sql 文件并使用插入创建测试对象。然后在java test中引用这些对象。
我在Growing Object-Oriented Software, Guided by Tests中读到,测试不需要深入细节。例如,如果测试希望现有用户具有NEW状态,那么他不需要创建用户并填写其所有字段。但他应该只说,他希望用户具有NEW状态,所有其他字段应填充默认值。
所以我想要帮助方法,比如这个:
User user = user(UserStatus.NEW); // inserts user in database
// ... use persistent user instance in test
但我的数据库架构有很多表,我来到了以下代码:
Domain domain = new DomainBuilder().user(UserStatus.NEW).agreement().account().account().build();
杜曼班:
public class Domain {
private User user;
private Agreement agreement;
private Account account;
// getters/setters
}
此代码创建用户,协议(使用FK到用户),两个帐户(使用FK到协议)并返回包含这些实体的Domain对象。
因此,使用此代码,我基本上可以在一行中设置特定测试的测试数据。
此测试数据生成方法优于SQL:
如果有一些列/约束,我不会坚持所有表列 添加/删除,然后我不需要在测试中更改测试数据生成。
这是更简洁的方式,SQL:我可以在一行中设置测试数据 而SQL方法需要为每个对象编写INSERT。
耗时少。是的,首先你开始使用这种方法,你必须花一些时间来实现这样的域构建器,但是一旦完成,那么你可以节省很多时间。
集中创建对象。如果数据库模式已更改,则必须仅在一个位置更改对象创建逻辑。
您不需要坚持使用像USER_WITH_NEW_STATUS_ID这样的java常量。
我的问题是:
是否还有人采用这种方法以及您使用的库/工具/约定?
更新 我在几种测试类型中使用这种方法:
存储库测试(例如,存储库正确过滤对象,或者返回 对象列表的顺序正确)。
业务逻辑+数据库集成测试(单元测试很好,但有时我需要100%确定我的业务逻辑和存储库逻辑是否一致
答案 0 :(得分:0)