3
我正在使用带有JDBI和h2-in-memory的Dropwizard框架来进行测试。另外我写了我的DAO,现在我想用单元测试来测试它们。我来到了似乎符合我的要求的DBUnit。如何使用H2内存数据库测试JDBI DAO?
但是如何将它与JDBI整合并填充测试数据呢?
我正在使用带有JDBI和h2-in-memory的Dropwizard框架来进行测试。另外我写了我的DAO,现在我想用单元测试来测试它们。我来到了似乎符合我的要求的DBUnit。如何使用H2内存数据库测试JDBI DAO?
但是如何将它与JDBI整合并填充测试数据呢?
我实现这样的:
我创建了一个基础的DAO类,设置了我的DW的环境,搭建DBI比如我。这看起来像这样:
@BeforeClass
public static void setup() {
env = new Environment("test-env", Jackson.newObjectMapper(), null, new MetricRegistry(), null);
dbi = new DBIFactory().build(env, getDataSourceFactory(), "test");
dbi.registerArgumentFactory(new JodaDateTimeArgumentFactory());
dbi.registerMapper(new JodaDateTimeMapper(Optional.absent()));
}
static DataSourceFactory getDataSourceFactory()
{
DataSourceFactory dataSourceFactory = new DataSourceFactory();
dataSourceFactory.setDriverClass("org.h2.Driver");
dataSourceFactory.setUrl("jdbc:h2:mem:testDb");
dataSourceFactory.setUser("sa");
dataSourceFactory.setPassword("");
return dataSourceFactory;
}
public static DBI getDbi() {
return dbi;
}
public static Environment getEnvironment() {
return env;
}
不是这样会为您创建一个指向您的内存数据库的数据源。
没有在实际测试中,你可以使用DBI实例的测试之前创建你的DAO:
DaoA dao;
DaoB otherDao;
@Before
public void setupTests() throws IOException {
super.setupTests();
dao = dbi.onDemand(DaoA.class);
otherDao = dbi.onDemand(DaoB.class);
}
有了这个你的好去,你就可以开始测试。希望有所帮助。
阿图尔
编辑init的:
我的测试中初始化自己为好。为此我直接使用dbi来执行sql脚本。例如,测试与作为测试类路径资源的test1.sql脚本相关联。在这种情况下,我需要做的就是读取该脚本并在测试之前运行它。例如像这样:
StringWriter writer = new StringWriter();
InputStream resourceStream = this.getClass().getResourceAsStream("/sql/schema.sql");
if(resourceStream == null) {
throw new FileNotFoundException("schema not found");
}
IOUtils.copy(resourceStream, writer);
Handle handle = null;
try {
handle = dbi.open();
handle.execute(writer.toString());
handle.commit();
} finally {
handle.close();
if(resourceStream != null) {
resourceStream.close();
}
writer.close();
}
是的,谢谢!这就是我一直在寻找的东西。但为了测试目的,我想用我的测试数据填充我的测试数据库(以测试GET方法),我的目标是使我的测试独立于彼此。有没有一种优雅的方式来填补我的数据库模型类而不是手动查询jdbi数据库? – VanDavv
嗨,请参阅编辑您的数据库中的初始化数据 – pandaadb
您的代码无法正常工作。 'IOUtils.copy(resourceStream,writer);' - 这是不正确的 'super.setupTests();' - 哪个类是你扩展的? – VanDavv