所以我试图测试 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/