Un quadro di simulazione prende la ridondanza e lo schema di partenza da una prova di beffa.
Sa creare l'oggetto Mock perché lo dici, naturalmente (a meno che tu non intenda qualcos'altro con quella domanda).
Il modo "standard" per creare un oggetto fittizio è utilizzare/abusare della classe java.lang.reflect.Proxy per creare un'implementazione runtime dell'interfaccia. Questo è fatto in fase di runtime. Il proxy ha una limitazione nel senso che non può proxy classi concrete. Per eseguire il mocking delle classi concrete è necessaria la creazione dinamica di bytecode che crea sottoclassi che annullano la reale implementazione dei metodi pubblici con essenzialmente ciò che verrebbe fatto con un Proxy (registra i parametri del metodo e restituisce un valore predeterminato). Questo ha una limitazione nel fatto che non può sottoclasse le classi finali. Per questo, hai soluzioni come JDave, che (credo, non ho confermato questo) muck con il classloader per rimuovere la designazione finale sulla classe prima di caricarla, quindi la classe non è in realtà finale in runtime il più lontano come la JVM è interessata.
Il framework di Mocking è fondamentalmente basato sull'acquisizione dei parametri e sulla verifica rispetto alle aspettative predeterminate e quindi sulla restituzione di un valore predefinito preconfigurato o ragionevole. Non si comporta in alcun modo particolare, che è il punto. Il codice chiamante viene verificato che chiama il metodo con il parametro corretto e forse come reagisce a valori di ritorno specifici o eccezioni generate. Non si verificano effetti collaterali o real realizzazioni della chiamata sull'oggetto reale.
Ecco un esempio reale da un progetto, utilizzando JMock con JUnit4. Ho aggiunto commenti per spiegare cosa sta succedendo.
@RunWith(JMock.class) //The JMock Runner automatically checks that the expectations of the mock were actually run at the end of the test so that you don't have to do it with a line of code in every test.
public class SecuredPresentationMapTest {
private Mockery context = new JUnit4Mockery(); //A Mockery holds the state about all of the Mocks. The JUnit4Mockery ensures that a failed mock throws the same Error as any other JUnit failure.
@Test
public void testBasicMap() {
final IPermissionsLookup lookup = context.mock(IPermissionsLookup.class); //Creating a mock for the interface IPermissionsLookup.
context.checking(new Expectations(){{ //JMock uses some innovative but weird double brace initialization as its standard idom.
oneOf(lookup).canRead(SecuredEntity.ACCOUNTING_CONTRACT);
//expect exactly one call to the IPermissionsLookup.canRead method with the the enum of ACCOUNTING_CONTRACT as the value. Failure to call the method at all causes the test to fail.
will(returnValue(true)); //when the previous method is called correctly, return true;
}});
Map<String, Component> map = new SecuredPresentationMap(lookup, SecuredEntity.ACCOUNTING_CONTRACT);
//This creates the real object under test, but passes a mock lookup rather than the real implementation.
JLabel value = new JLabel();
map.put("", value);
assertThat(((JLabel) map.get("")), is(value)); //This ensures that the Map returns the value placed, which it should based on the fact that the mock returned true to the security check.
}
}
Se la simulazione passata è stata ignorata, il test avrebbe avuto esito negativo. Se la mappa non riesce a restituire il valore inserito, il test fallisce (ovvero JUnit standard).
Ciò che viene testato qui e in un altro test opposto è che, a seconda di ciò che dice l'interfaccia IPermissionsLookup in merito alla sicurezza, la mappa modifica il suo comportamento rispetto a ciò che viene restituito. Questa è la buona base. L'altro test, la finta restituisce false e qualcos'altro è atteso dalla mappa. L'utilizzo della simulazione garantisce che la mappa si basi sul metodo IPermissionsLookup per determinare la posizione di sicurezza e ciò che viene restituito.
Forse non avresti voluto le risposte "migliore quadro", ma è quello che stai per ottenere ... – skaffman
Vedi anche http://stackoverflow.com/questions/2277039/how-do-mock-frameworks-work , anche se le risposte sono molto tecniche. –