繁体   English   中英

使用模拟对象进行junit测试:存根内部函数调用

[英]junit testing with mock objects: stub inner function calls

所以我试图测试ping()方法,并确保它调用connect()disconnect() 我嘲笑对象foo和对象Connection 然后我做了stub(mockFoo.connect()).toReturn(mockConn)希望ping()应该返回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
    }

通常,您不会自己嘲笑被测单元。 Mockito将对所有方法使用默认的存根行为。 因此,对ping()的调用只会返回默认的false ,而不会调用foo其他方法。

您可以通过对foo进行监视来进行部分模拟,然后根据需要对connect方法进行存根。 虽然我不建议这样做。 理想情况下,您将注入对协作者(在这种情况下为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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM