0

所以我试图测试ping()方法并确保它调用connect()disconnect(). 我嘲笑了 objectfoo和 object Connection。然后我确实stub(mockFoo.connect()).toReturn(mockConn)希望 thenping()应该返回 true 让我断言。但是,不知何故,这种存根并没有通过。我怀疑可能在内部调用 connect 时, mockFoo 实际上并没有调用connect(),因此没有返回模拟 Connection,但我不确定。

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 将对所有方法使用默认的存根行为。所以调用 toping()只会返回默认值false,不会foo调用其他方法。

您可以通过在 foo 上进行间谍活动来进行部分模拟,然后像您一样对 connect 方法进行存根。虽然我不会推荐这个。理想情况下,您将注入对协作者(在本例中为连接)的依赖项。建立连接和使用连接是不同的职责,实际上属于不同的类。

所以更像这样:

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 回答