2016-03-06 49 views
3

我正在使用带有JDBI和h2-in-memory的Dropwizard框架来进行测试。另外我写了我的DAO,现在我想用单元测试来测试它们。我来到了似乎符合我的要求的DBUnit。如何使用H2内存数据库测试JDBI DAO?

但是如何将它与JDBI整合并填充测试数据呢?

回答

6

我实现这样的:

我创建了一个基础的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(); 
      } 
+0

是的,谢谢!这就是我一直在寻找的东西。但为了测试目的,我想用我的测试数据填充我的测试数据库(以测试GET方法),我的目标是使我的测试独立于彼此。有没有一种优雅的方式来填补我的数据库模型类而不是手动查询jdbi数据库? – VanDavv

+0

嗨,请参阅编辑您的数据库中的初始化数据 – pandaadb

+0

您的代码无法正常工作。 'IOUtils.copy(resourceStream,writer);' - 这是不正确的 'super.setupTests();' - 哪个类是你扩展的? – VanDavv

相关问题