[英]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.