2012-03-15 40 views
2

我有在Jboss服務器上執行查詢的代碼。它擁有一個基於JNDI數據源,看起來像這樣:替換Mockito中的DataSource

public class JNDIBasedDao { 

     DataSource dataSource; 

     public JNDIBasedDao(){ 

      try { 
       InitialContext ic = new InitialContext(); 
       dataSource = (DataSource) ic.lookup("java://bla-bla-bla"); 
      } catch (NamingException e) { 
      e.printStackTrace(); 
      } 


     } 

public class Manager { 

    public Manager(){} 

    private JNDIBasedDao dao = new JNDIBasedDao(); 

    public void runOperation(){ 
     this.dao.executeInsert(); 
    } 

在我的筆記本電腦我沒有JBoss和沒有連接到該服務器,並要對其運行HSQLDB單元測試的能力。

我想從基於HSQLDB的apache commons中創建BasicDataSource並將此對象注入到JNDIBasedDao中。

@Mock 
BasicDataSource dataSource = new BasicDataSource(); 

@Mock 
JNDIBasedDao dao = new JNDIBasedDao(); 

@InjectMocks 
Manager manager = new Manager(); 
@Before 
    public void initMocks(){ 
     dataSource.setDriverClassName("org.hsqldb.jdbcDriver"); 
     dataSource.setUrl("jdbc:hsqldb:mem:dannyTest"); 
     dataSource.setUsername("sa"); 
     dataSource.setPassword(""); 
     dataSource.setInitialSize(5); 
     dataSource.setMaxActive(10); 
     dataSource.setPoolPreparedStatements(true); 
     dataSource.setMaxOpenPreparedStatements(10); 

     MockitoAnnotations.initMocks(this); 

    } 

    @Test 
    public void testRunOperartion() { 
     manager.runOperartion(); 
    } 

但我仍然收到JNDI錯誤。可以做到嗎?請幫忙。

+0

是否有一個特定的原因,你不想嘲笑你的DAO,而不是數據源? – Perception 2012-03-15 00:52:49

回答

1

由於您使用的是@Mock,因此不需要通過調用它們的構造函數實例化這些對象。

相反的:

@Mock 
BasicDataSource dataSource = new BasicDataSource(); 

@Mock 
JNDIBasedDao dao = new JNDIBasedDao(); 

嘗試:

@Mock 
BasicDataSource dataSource; 

@Mock 
JNDIBasedDao dao; 

,並讓處理的Mockito創建這些類的模擬版本。

當然,當你這樣做你會得到模擬版本的這些類,因此調用您的數據源所有這些方法將導致調用默認的Mockito stubbings ......這什麼也不做。

不知道爲什麼你結合@Mock與方法調用它看起來像你期望有一個結果的同一對象上...

通過調試也許退一步,檢查運行時類的對象中的youre在此時使用異常。他們可能不是你所期望的。

1

@InjectMocks將只執行setter注入。

更改Manager類

private JNDIBasedDao dao = new JNDIBasedDao(); 

以下到

private JNDIBasedDao dao; 

,並添加

void setDao(JNDOBasedDao dao) 
{ 
    this.dao = dao; 
} 
+0

在最新版本中,@InjectMocks也會進行字段注入。請參閱:http://docs.mockito.googlecode.com/hg/latest/org/mockito/Mockito.html#23 – 2012-03-16 12:25:55

1

您可以創建一個構造和注入的InitialContext。

public class JNDIBasedDao { 
    DataSource dataSource; 

    public JNDIBasedDao() { 
    this(new InitialContext()); 
    } 

    public JNDIBasedDao(InitialContext ic) { 
    try { 
     dataSource = (DataSource) ic.lookup("java://bla-bla-bla"); 
    } catch (NamingException e) { 
     e.printStackTrace(); 
    } 
    } 

    .... 
} 

現在您可以提供一個模擬的InitialContext,它提供了您的DataSource。