2013-07-10 81 views
2

某些ORM技術(JPA EntityManager,Hibernate Session等等)的某些功能可以充當標準JDBC連接的「對象高速緩存」。模擬JPA /休眠數據庫

對於一些測試目的,如果我實際上並不需要堅持的任何數據(從未承諾任何東西到數據庫,物理或嵌入/內存之一)以及剛剛在ORM的對象級緩存是完全足夠的,有什麼辦法可以完全消除(或嘲笑)對數據庫的需求嗎?

**澄清:無嵌入式或內存數據庫。我的意思是根本沒有數據庫(或者至多是沒有任何數據源的數據源/連接模擬)。

回答

1

執行此操作的一種方法是使用JPA並將其配置爲在僅限內存模式下使用HSQL。您將獲得完整的JPA功能集,而不會將任何內容寫入磁盤。

+1

我知道我可以使用嵌入式/內存數據庫,但這不是重點;我試圖完全*消除(或嘲笑)對數據庫的需求。我只*需要entityManager或會話的對象級緩存 - 甚至不需要任何數據庫*(甚至是內存中的一個!)。所以,回到我的問題,這可能嗎? – ManRow

0

您可以使用模擬框架,如dirty-mockito。例如

@Mock 
private EntityManager em; 

@Mock 
private Query query; 

private WidgetDao widgetDao; 

@Test 
public void testFindByName() { 
    Widget widget = new Widget(); 

    when(em.createNamedQuery("WidgetDao.findByName")).thenReturn(query); 
    when(query.getResultList()).thenReturn(Collections.singletonList(widget)); 

    assertSame(widget, widgetDao.findByName("Bob")); 

    verify(query).setParameter("name", "Bob"); 
} 
+0

我不想模擬出EntityManager ---該對象應該是* real *實例!我試圖嘲笑底層的* DataSource *,而不是使用任何數據庫(物理或嵌入/內存)。 – ManRow

+0

你究竟想要測試什麼?你在說「對於某些測試目的來說,只是ORM的對象級緩存就足夠了」。你究竟是什麼意思? –

+0

我沒有看到任何嵌入式數據源的問題。當創建「EntityManager」時,提供者(即Hibernate)根據持久化單元中定義的內容注入「DataSource」。您可以模擬'DataSource'是否使用'JdbcTemplate',如此處所述http://forum.springsource.org/showthread.php?85437-Mocking-SimpleJdbcTemplate –

1

逾期隨訪,但對於整個這個職位的人來了,Acolyte提供了嘲諷JDBC驅動程序,我認爲是什麼OP正在尋求。