In questo contesto, la parola "stub" è usata al posto di "mock", ma per motivi di chiarezza e precisione, l'autore avrebbe dovuto usare "mock", perché "mock" è una sorta di stub, ma per testare. Per evitare ulteriore confusione, dobbiamo definire cos'è uno stub.
Nel contesto generale, uno stub è un pezzo di programma (tipicamente una funzione o un oggetto) che incapsula la complessità di invocare un altro programma (solitamente situato su un'altra macchina, VM o processo - ma non sempre, può anche essere un locale oggetto). Poiché il programma effettivo da invocare di solito non si trova nello stesso spazio di memoria, invocarlo richiede molte operazioni come l'indirizzamento, l'esecuzione dell'effettiva invocazione remota, il marshalling / serializzazione dei dati / argomenti da passare (e lo stesso con il potenziale risultato), forse anche occuparsi di autenticazione / sicurezza e così via. Si noti che in alcuni contesti, gli stub sono anche chiamati proxy (come i proxy dinamici in Java).
Un mock è un tipo di stub molto specifico e restrittivo, perché un mock è una sostituzione di un'altra funzione o oggetto per il test. In pratica usiamo spesso i mock come programmi locali (funzioni o oggetti) per sostituire un programma remoto nell'ambiente di test. In ogni caso, il mock può simulare il comportamento effettivo del programma sostituito in un contesto ristretto.
I tipi più famosi di stub sono ovviamente per la programmazione distribuita, quando è necessario richiamare procedure remote ( RPC ) o oggetti remoti ( RMI , CORBA ). La maggior parte dei framework / librerie di programmazione distribuiti automatizza la generazione di stub in modo da non doverli scrivere manualmente. Gli stub possono essere generati da una definizione di interfaccia, scritta con IDL per esempio (ma puoi anche usare qualsiasi linguaggio per definire le interfacce).
Tipicamente, in RPC, RMI, CORBA e così via, si distinguono gli stub lato client , che si occupano principalmente del marshalling / serializzazione degli argomenti e dell'esecuzione dell'invocazione remota, e gli stub lato server , che si occupano principalmente di unmarshaling / deserializzazione gli argomenti ed effettivamente eseguire la funzione / metodo remoto. Ovviamente, gli stub del client si trovano sul lato client, mentre gli stub del server (spesso chiamati skeletons) si trovano sul lato server.
Scrivere buoni stub efficienti e generici diventa piuttosto difficile quando si tratta di riferimenti a oggetti. La maggior parte dei framework di oggetti distribuiti come RMI e CORBA si occupano di riferimenti a oggetti distribuiti, ma è qualcosa che la maggior parte dei programmatori evita ad esempio negli ambienti REST. In genere, negli ambienti REST, i programmatori JavaScript creano semplici funzioni stub per incapsulare le invocazioni AJAX (la serializzazione degli oggetti è supportata da JSON.parse
e JSON.stringify
). Il progetto Swagger Codegen fornisce un ampio supporto per la generazione automatica di stub REST in varie lingue.