(Voy a hablar de lo que conozco, Java, igual hay cosas que no cuadran en PHP, no lo se..)
A ver, para utilizar mocks, lo primero es que tu clase que estás probando no cree el objeto de acceso a BD, sino que sea inyectado (
http://es.wikipedia.org/wiki/Inyecci%C3%B3n_de_dependencias), ya que así en vez de pasarle el objeto real de acceso a BD le puedes pasar otro que creas en el test que será tu mock. Te pongo un ejemplo:
Tenemos una clase llamada Sumador que queremos probar y le metemos en el constructor la clase de acceso a BD. Voy a hacer el ejemplo sin usar ningún tipo de framework de mock para que se entienda el problema.
public class Sumador {
private ClaseAccesoBD bd;
public Sumador(ClaseAccesoBD bd) {
}
public int sumaNumerosDeLaBD(){
int numero1 = bd.getNumero1();
int numero2 = bd.getNumero2();
return numero1 + numero2;
}
}
Nuestra clase recibe un objeto que será nuestra interfaz con la BD. ClaseAccesoBD será un interfaz:
public interface ClaseAccesoBD {
public int getNumero1();
public int getNumero2();
}
Ahora necesitamos una clase que implemente esta interfaz. Habrá una que se conecte a la BD y obtenga esos números, que será tu clase "de producción". Pero vamos a definirnos otra que será nuestro mock.
public class ClaseAccesoBDMock implements ClaseAccesoBD {
public int getNumero1() {
return 3;
}
public int getNumero2(){
return 2;
}
}
Como ves, nuestro mock no hace nada más que devolver unos valores fijos sobre los que luego haremos la suma.
Así nuestro test podría quedar de la siguiente forma:
Sumador sumador = new Sumador(new ClaseAccesoBDMock);
assertThat(sumador.sumaNumerosDeLaBD(), is(5));
Con esto ya hemos probado que nuestro método suma bien.
En el código de producción real habrías puesto new Sumador(new ClaseAccesoDBDeVerdad());
Lo he hecho sencillo, pero podría ser mockear un método que reciba una query y devolviera un listado de números... sería lo mismo. Mi mock pasaría de lo que le llega y devolvería siempre lo mismo. Luego hay frameworks de mocks que te evitan escribir la clase de Mock incluso la necesidad de interfaz (porque en PHP...) Simplemente en esos frameworks defines un objeto mock de la clase de acceso a la BD donde le dices que tus métodos getNumero1 y getNumero2 devuelvan siempre 2 y 3 y ya está. Luego se lo pasarás a tu Sumador y todo lo demás igual.
Como ves, la clase Sumador no cambia, da igual que sea el acceso a BD de verdad o el mockeado.