Mazzi/tronchi/falsi/raddoppia test/ecc. vanno bene nei test unitari e consentono di testare la classe/il sistema in prova separatamente. I test di integrazione potrebbero non utilizzare nessun mock; in realtà colpiscono il database o altre dipendenze esterne.
Si utilizza un finto o uno stub quando è necessario. Generalmente questo è perché la classe che stai provando a testare ha una dipendenza da un'interfaccia. Per TDD si desidera programmare interfacce, non implementazioni e utilizzare l'iniezione delle dipendenze (in generale).
Un caso molto semplice:
public class ClassToTest
{
public ClassToTest(IDependency dependency)
{
_dependency = dependency;
}
public bool MethodToTest()
{
return _dependency.DoSomething();
}
}
IDependency è un'interfaccia, forse uno con chiamate costose (accesso al database, chiamate di servizi Web, ecc). Un metodo di prova potrebbe contenere codice simile 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);
Nota che sto facendo i test di stato (come suggerito @Finglas), e sto solo affermando contro il sistema in prova (l'istanza della classe I' m test). Potrei controllare i valori di proprietà (stato) o il valore di ritorno di un metodo, come mostra questo caso.
Si consiglia di leggere The Art of Unit Testing, soprattutto se si utilizza .NET.
Per l'ultimo controllo del punto: http://martinfowler.com/articles/mocksArentStubs.html solo per accertarsi di essere a conoscenza delle differenze. – Finglas
Ecco una buona lettura che affronta alcune di queste domande: http://xunitpatterns.com/TestStrategy.html –