2012-07-30 36 views
0

我要寫一個JUnit來檢查版本是否被維護(在一個事件上)。下面是我使用的是什麼JUnit的:如何爲使用envers的代碼創建Junit?

@Test 
Public void testAudit() { 
    try { 
     //create Dao code 
     dao.save(); //This will create entry in AUD- and REVINFO-tables perfectly 
     SomeObject obj = SomeHelper.getAuditData(dao)); 
     /*Method to be tested which generates audit message using envers i.e(dao created)*/ 
     //Some logic to check if output is as expected 
    } 
    catch(Exception e) { 
     Assert.fail(); 
    } 
    finally { 
     dao.delete(); //delete the data saved by JUnit (Problem starts here) 
    } 
} 

調用刪除DAO將導致

UnsupportedOperationException異常:無法寫入只讀對象

我使用了Ehcache緩存。我搜索了這個問題,並且知道這可能是因爲CacheConcurrencyStrategy錯誤地爲我想要刪除的域對象設置的。我檢查了。

對於域對象,沒有CacheConcurrencyStrategy。但嵌套對象有CacheConcurrencyStrategy設爲READ_WRITE(這可能是真正的罪魁禍首)。

但我不想更改現有的域和現有的代碼。對於JUnit,有什麼辦法可以繞過CacheConcurrencyStrategy?如果沒有,有沒有可能的出路而不改變現有的代碼?

+0

您應該向我們展示引發異常的位置,刪除操作是什麼?爲什麼ch是你的堆棧跟蹤? – Matteo 2012-07-30 21:54:55

+0

你是否嘗試刪除Envers條目?如果您想刪除審計數據,也許只是試圖清空修訂表。 – adamw 2012-08-01 06:07:10

回答

0

ENVERs數據是在事務提交後寫入的,所以你的代碼將永遠不會訪問審計記錄,因爲還不存在。如果你想測試ENVER,你需要自己管理交易。這是一個例子;

@Before 
public void setup() { 
    // Envers audit information is written via post-event listeners and therefore the transaction needs to be 
    // committed. 
    PlatformTransactionManager txMgr = applicationContext.getBean(PlatformTransactionManager.class); 
    TransactionStatus status = txMgr.getTransaction(new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_REQUIRES_NEW)); 
    Account account = accountDAO.getByUsername(UPDATE); 
    if (account != null) { 
     accountDAO.delete(account); 
    } 

    account = createAccount(); 
    account.setUsername(INITIAL); 
    accountDAO.update(account); 
    txMgr.commit(status); 

    status = txMgr.getTransaction(new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_REQUIRES_NEW)); 
    account.setUsername(UPDATE); 
    accountDAO.update(account); 
    txMgr.commit(status); 

} 

然後在您的測試中,您可以隨意查詢審計信息(原始SQL,通過AuditReader等)。