oppure la classe può implementare anche una classe astratta?Per deridere un oggetto, deve essere implementato un'interfaccia o contrassegnato virtuale?
risposta
per deridere un tipo, deve essere o un'interfaccia (questo è anche chiamato essendo puri virtuali) o avere membri virtuali (membri astratti sono anche virtuale).
Con questa definizione, è possibile prendere in giro tutto ciò che è virtuale.
In sostanza, i mazzi dinamici non fanno nulla che non sia possibile fare a mano.
Diciamo che si sta programmando contro un'interfaccia come questa:
public interface IMyInterface
{
string Foo(string s);
}
Si potrebbe creare manualmente una specifica implementazione test di IMyInterface che ignora il parametro di input e restituisce sempre la stessa uscita:
public class MyClass : IMyInterface
{
public string Foo(string s)
{
return "Bar";
}
}
tuttavia, che diventa ripetitivo molto veloce se si desidera verificare come il consumatore risponde a diversi valori di ritorno, così invece di codificare fino tuo test Doppio a mano, si può ettari ve un framework li crea dinamicamente per te.
Immaginate che i mock dinamici scrivano davvero codice simile all'implementazione di MyClass sopra (in realtà non scrivono il codice, emettono dinamicamente i tipi, ma è un'analogia abbastanza precisa).
Ecco come si potrebbe definire lo stesso comportamento come MyClass con Moq:
var mock = new Mock<IMyInterface>();
mock.Setup(x => x.Foo(It.IsAny<string>())).Returns("Bar");
In entrambi i casi, la construcor della classe creata sarà chiamato quando si crea l'oggetto. Poiché un'interfaccia non ha costruttore, questo sarà normalmente il costruttore predefinito (rispettivamente di MyClass e della classe emessa dinamicamente).
Si può fare lo stesso con i tipi concreti come questo:
public class MyBase
{
public virtual string Ploeh()
{
return "Fnaah";
}
}
A mano, si sarebbe in grado di derivare da MyBase e l'override del metodo Ploeh perché è virtuale:
public class TestSpecificChild : MyBase
{
public override string Ploeh()
{
return "Ndøh";
}
}
Una libreria fittizia dinamica può fare lo stesso, e lo stesso vale per i metodi astratti.
Tuttavia, non è possibile scrivere codice che sovrascrive un membro non virtuale o interno e nemmeno i mock dinamici. Possono solo fare ciò che puoi fare a mano.
Avvertenza: la descrizione precedente è vera per la maggior parte dei mock dinamici, ad eccezione di TypeMock, che è diverso e ... spaventoso.
C'è anche una nuova libreria di simulazione, Microsoft Moles, che fa anche ciò che TypeMock fa ... prende in giro tutto, compresi i metodi non virtuali, sigillati e statici. –
È possibile utilizzare per creare Moq prende in giro da entrambe le interfacce e classi esistenti. Ci sono alcuni requisiti per le classi. La classe non può essere sigillata. Inoltre, il metodo che viene deriso deve essere contrassegnato come virtuale. Non è possibile simulare metodi statici (utilizzare il modello dell'adattatore per simulare un metodo statico).
- 1. Un'implementazione del metodo C++ virtuale nel file .cpp deve essere contrassegnata come virtuale?
- 2. Modello MVC C++ - Come deve essere implementato?
- 3. Come deve essere implementato un pool di thread in C?
- 4. DDD: "Paese" deve essere un oggetto valore o un'entità?
- 5. Quando deve essere eliminato un oggetto ManualResetEvent?
- 6. Struct.Error, deve essere un oggetto Bytes?
- 7. C'è un modo per deridere parzialmente un oggetto usando EasyMock?
- 8. cosa deve essere implementato da una classe astratta in java?
- 9. MVP Android: un'attività deve essere una visualizzazione o un relatore?
- 10. Il lato sinistro per un operatore ALL o ANY deve essere un NSArray o un NSSet
- 11. C# "deve dichiarare un corpo perché non è contrassegnato come astratto, extern o parziale"
- 12. come per deridere un metodo in un oggetto quando testare un metodo nello stesso oggetto
- 13. C'è un modo per deridere QSqlQuery?
- 14. Come identificare se un oggetto deve essere in pila o no?
- 15. NSPredicate 'Il lato sinistro per un operatore ALL o ANY deve essere un NSArray o NSSet'
- 16. Min (5) deve essere minore o uguale a max (-1) in un oggetto Range?
- 17. La vista dettagli generica deve essere richiamata con un oggetto pk o una lumaca
- 18. C#: Come dovrebbe essere implementato ToString()?
- 19. Perché un metodo di interfaccia C# implementato in una classe deve essere pubblico?
- 20. Come deridere un provider
- 21. Un NSString letterale è autoreleased o deve essere rilasciato?
- 22. Float deve essere una stringa o un numero?
- 23. regno non può essere contrassegnato dinamica
- 24. È un esecutore che deve essere riutilizzato?
- 25. un parametro di metodo può passare un oggetto per riferimento ma deve essere di sola lettura?
- 26. La costante non può essere contrassegnato statica
- 27. Quando un riferimento deve essere atomico?
- 28. Laravel Il contenuto della risposta deve essere una stringa o un oggetto che implementa __toString(), "oggetto" dato
- 29. RNMK - Super espressione deve essere o nullo o una funzione
- 30. Suggerimenti per un file Mock java (per deridere java.io.File)
Hai appena chiesto essenzialmente la stessa domanda qualche giorno fa: http://stackoverflow.com/questions/1969497/can-you-mock-an-object-that-implements-an-interface-and-an-abstract -class –