某些ORM技術(JPA EntityManager,Hibernate Session等等)的某些功能可以充當標準JDBC連接的「對象高速緩存」。模擬JPA /休眠數據庫
對於一些測試目的,如果我實際上並不需要堅持的任何數據(從未承諾任何東西到數據庫,物理或嵌入/內存之一)以及剛剛在ORM的對象級緩存是完全足夠的,有什麼辦法可以完全消除(或嘲笑)對數據庫的需求嗎?
**澄清:無嵌入式或內存數據庫。我的意思是根本沒有數據庫(或者至多是沒有任何數據源的數據源/連接模擬)。
某些ORM技術(JPA EntityManager,Hibernate Session等等)的某些功能可以充當標準JDBC連接的「對象高速緩存」。模擬JPA /休眠數據庫
對於一些測試目的,如果我實際上並不需要堅持的任何數據(從未承諾任何東西到數據庫,物理或嵌入/內存之一)以及剛剛在ORM的對象級緩存是完全足夠的,有什麼辦法可以完全消除(或嘲笑)對數據庫的需求嗎?
**澄清:無嵌入式或內存數據庫。我的意思是根本沒有數據庫(或者至多是沒有任何數據源的數據源/連接模擬)。
執行此操作的一種方法是使用JPA並將其配置爲在僅限內存模式下使用HSQL。您將獲得完整的JPA功能集,而不會將任何內容寫入磁盤。
您可以使用模擬框架,如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");
}
我不想模擬出EntityManager ---該對象應該是* real *實例!我試圖嘲笑底層的* DataSource *,而不是使用任何數據庫(物理或嵌入/內存)。 – ManRow
你究竟想要測試什麼?你在說「對於某些測試目的來說,只是ORM的對象級緩存就足夠了」。你究竟是什麼意思? –
我沒有看到任何嵌入式數據源的問題。當創建「EntityManager」時,提供者(即Hibernate)根據持久化單元中定義的內容注入「DataSource」。您可以模擬'DataSource'是否使用'JdbcTemplate',如此處所述http://forum.springsource.org/showthread.php?85437-Mocking-SimpleJdbcTemplate –
逾期隨訪,但對於整個這個職位的人來了,Acolyte提供了嘲諷JDBC驅動程序,我認爲是什麼OP正在尋求。
我知道我可以使用嵌入式/內存數據庫,但這不是重點;我試圖完全*消除(或嘲笑)對數據庫的需求。我只*需要entityManager或會話的對象級緩存 - 甚至不需要任何數據庫*(甚至是內存中的一個!)。所以,回到我的問題,這可能嗎? – ManRow