// Copyright (c) 2005 Dustin Sallings <dustin@spy.net>
package net.spy.db;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import net.spy.util.SpyConfig;
import org.jmock.Mock;
/**
* Base class for mock connection sources.
*/
public abstract class MockConnectionSource extends Object
implements ConnectionSource {
private Map<Object, Mock> mocks=null;
public MockConnectionSource() {
super();
mocks=new HashMap<Object, Mock>();
}
protected void registerMock(Mock m) {
mocks.put(m.proxy(), m);
}
public Mock getMock(Object proxy) {
return mocks.get(proxy);
}
public void clearSeenObjects() {
mocks.clear();
}
public Collection<?> getSeenObjects() {
return(mocks.values());
}
/**
* This method will be called with the connection source to set up the
* expectations of the source.
*/
protected abstract void setupMock(Mock connMock, SpyConfig conf);
public Connection getConnection(SpyConfig conf) throws SQLException {
Mock connMock=new Mock(Connection.class);
setupMock(connMock, conf);
registerMock(connMock);
return((Connection)connMock.proxy());
}
public void returnConnection(Connection conn) {
try {
conn.close();
} catch(SQLException e) {
throw new RuntimeException(
"jmock threw a SQLException on close", e);
}
}
/**
* Verify all of the connections that were handed out.
*/
public void verifyConnections() throws Exception {
for(Iterator<?> i=getSeenObjects().iterator(); i.hasNext(); ) {
Mock m=(Mock)i.next();
m.verify();
}
clearSeenObjects();
}
}