Mocks/stubs/fakes/test doubles/etc. están bien en pruebas unitarias, y permiten probar la clase/sistema bajo prueba de forma aislada. Las pruebas de integración pueden no usar ningún simulacro; de hecho golpean la base de datos u otra dependencia externa.
Utiliza un simulacro o un talón cuando sea necesario. En general, esto se debe a que la clase que intentas probar depende de una interfaz. Para TDD, usted desea programar interfaces, no implementaciones, y usar inyección de dependencia (generalmente hablando).
Un caso muy simple:
public class ClassToTest
{
public ClassToTest(IDependency dependency)
{
_dependency = dependency;
}
public bool MethodToTest()
{
return _dependency.DoSomething();
}
}
IDependency es una interfaz, posiblemente, uno con llamadas costosas (acceso de base de datos, llamadas de servicio web, etc.). Un método de prueba puede contener código similar a:
// Arrange
var mock = new Mock<IDependency>();
mock.Setup(x => x.DoSomething()).Returns(true);
var systemUnderTest = new ClassToTest(mock.Object);
// Act
bool result = systemUnderTest.MethodToTest();
// Assert
Assert.That(result, Is.True);
Tenga en cuenta que estoy haciendo pruebas de estado (como se sugiere @Finglas), y yo sólo estoy afirmando en contra del sistema bajo prueba (la instancia de la clase I' m prueba). Puedo verificar los valores de propiedad (estado) o el valor de retorno de un método, como se muestra en este caso.
Recomiendo leer The Art of Unit Testing, especialmente si usa .NET.
Para su último punto, consulte: http://martinfowler.com/articles/mocksArentStubs.html solo para asegurarse de que conoce las diferencias. – Finglas
He aquí una buena lectura que aborda algunas de estas preguntas: http://xunitpatterns.com/TestStrategy.html –