2012-12-14 26 views
0

所以我試圖測試ping()方法並確保它調用connect()disconnect()。我嘲笑對象foo和一個對象Connection。然後我做了stub(mockFoo.connect()).toReturn(mockConn)希望那麼ping()應該返回true,我來斷言。但是,不知怎的,這個樁頭沒有經過。我懷疑,也許當內部調用連接時,mockFoo實際上並沒有調用connect(),因此沒有返回模擬連接,但我不確定。用模擬對象進行junit測試:存根內部函數調用

public class foo{ 
    public boolean ping(){ 
     bool ping = false; 
     Connection conn = null; 
     try{ 
      conn = connect(); 
      ping = true; 
     }catch(Exception e){ 
     }finally{ 
      disconnect(conn); 
     } 
     return ping; 
    } 

    public Connection connect(){ 
     //some implementation 
     return connect 
    } 

回答

5

通常你不會模擬被測單元本身。 Mockito將爲所有方法使用默認的樁存行爲。因此,致電ping()將簡單地返回默認false,並且不會調用foo的其他方法。

您可以通過在foo上創建一個間諜來進行部分嘲弄,然後根據您的需要對連接方法進行存根。雖然我不會推薦這個。 理想情況下,您將對注入的協作者(在本例中爲Connection)有依賴關係。建立連接和使用連接是不同的責任,並且屬於不同的類別。

因此,更多的是這樣的:

public class Foo { 

    private final ConnectionProvider connectionProvider; 

    private Foo(ConnectionProvider connectionProvider) { 
     this.connectionProvider = connectionProvider; 
    } 

    public boolean ping(){ 
      boolean ping = false; 
      Connection connection = null; 
      try{ 
       connection = connectionProvider.getConnection(); 
       ping = true; 
      }catch(Exception e){ 
       // TODO handle this exception 
      }finally{ 
       try { 
        connection.close(); 
       } catch (SQLException e) { 
        // TODO handle this exception 
       } 
      } 
      return ping; 
     } 

} 

public interface ConnectionProvider { 

    Connection getConnection(); 
} 

@org.junit.Test 
public void testConnection() throws Exception { 
    ConnectionProvider mockProvider = mock(ConnectionProvider.class); 
    Connection mockConnection = mock(Connection.class); 
    when(mockProvider.getConnection()).thenReturn(mockConnection); 

    Foo foo = new Foo(mockProvider); 

    assertTrue(foo.ping()); 

    verify(mockConnection).close(); 
} 
相關問題