2011-06-22 52 views
3

我想爲我的dao編寫一個Junit測試,但是我遇到了問題。這是我要測試的方法:用mockito命名查詢測試參數

public boolean boo(final String param) { 
      final Query query = this.entityManager.createNamedQuery("queryName"); 
      query.setParameter(1, param); 
      boolean isExists = false; 
      if(query.getResultList().size() != 0) { 
       isExists = true; 
      } 
      return isExists; 
     } 

這種方法的問題是:

query.setParameter(1, param); 

當我寫的東西,如:

@Test 
    public void test() {   
     when(entityManager.createNamedQuery(queryName)).thenReturn(query); 
     when(query.getResultList()).thenReturn(new ArrayList()); 
     //when(query.setParameter(1,project.getName())).thenCallRealMethod(); 
     projectDao.boo(name); 

    } 

查詢和EntityManager的被嘲笑。 我有NPE,這不是一個驚喜,我不能調用該方法,因爲查詢是和接口。 那麼有人可以告訴我在測試時在NamedQueries中設置參數的最佳方法嗎?

+1

你想要測試什麼?我沒有看到斷言。你從哪裏得到你的查詢。如果查詢被嘲笑,你不應該得到一個NPE。如果你想測試實際的查詢,你正在創建一個集成測試,你通常必須設置你的DAO完全沒有嘲笑。 – joostschouten

回答

6

你應該要建立這樣的查詢接口的模擬...

@Test 
public void test() { 

    Query query = mock(Query.class); 

    when(entityManager.createNamedQuery(queryName)).thenReturn(query); 

    ... 

也許你忘了周圍的字符串文字「queryName」雙引號。在你的代碼中,我看不到在上面最後一行定義變量queryName的位置。