0

だから私はメソッドをテストして、それがとを呼び出すことを確認しようとしてping()いました。オブジェクトとオブジェクトをモックしました。それから私はそれが私が主張するためにtrueを返すはずであることを望んでいました。しかし、どういうわけか、このスタブは通過していません。おそらくconnectが内部で呼び出されたときに、mockFooが実際に呼び出されなかったため、mock Connectionが返されなかったのではないかと思いますが、よくわかりません。connect()disconnect()fooConnectionstub(mockFoo.connect()).toReturn(mockConn)ping()connect()

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
    }
4

1 に答える 1

5

通常、テスト対象のユニット自体をモックしません。Mockito は、すべてのメソッドに対してデフォルトのスタブ動作を使用します。したがって、 を呼び出すとping()デフォルトの が返されるだけfalseで、 の他のメソッドはfoo呼び出されません。

foo にスパイを作成して部分的なモックを作成し、接続メソッドをスタブ化することができます。私はこれをお勧めしませんが。理想的には、コラボレーター (この場合は接続) への依存関係を注入する必要があります。接続のセットアップと接続の使用は異なる責任であり、実際には異なるクラスに属します。

このようにもっと:

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();
}
于 2012-12-14T18:45:27.110 に答える