java - 使用模拟对象进行 junit 测试 : stub inner function calls

标签 java unit-testing junit mockito

所以我试图测试 ping() 方法并确保它调用 connect()disconnect()。我模拟了对象 foo 和对象 Connection。然后我做了 stub(mockFoo.connect()).toReturn(mockConn) 希望 ping() 应该返回 true 以便我断言。然而,不知何故,这种 stub 并没有进行。我怀疑也许当内部调用 connect 时,mockFoo 实际上并没有调用 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
    }

最佳答案

通常您不会模拟被测单元本身。 Mockito 将为所有方法使用默认的 stub 行为。因此,调用 ping() 将仅返回默认的 false,并且不会调用 foo 的其他方法。

您可以通过对 foo 进行 spy 操作来进行部分模拟,然后按您的方式 stub connect 方法。虽然我不会推荐这个。 理想情况下,您将注入(inject)对协作者(在本例中为连接)的依赖项。设置连接和使用连接是不同的职责,并且实际上属于不同的类。

更多的是这样的:

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();
}

关于java - 使用模拟对象进行 junit 测试 : stub inner function calls,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13884502/

相关文章:

java - 将 sql Developer 与 netbeans 连接

java - 返回平方数的 intStream

c++ - 我如何从终端的谷歌测试套件中获取 C++ 代码超量?

java - 测试私有(private)变量 - 总是不好的做法?

java - JUnit:是否可以创建一个测试套件来执行共享命名约定的类的所有测试?

java - Mockito - 如何验证从未调用过模拟

Java 对象转 JSON : field names

java - 共享网 : How to send a file over FTP using ASCII without changing LF to CRLF

ruby-on-rails - rails : How do I write tests for a ruby module?

unit-testing - Java 单元测试 : Replace a private method under test