Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Roborock Qrevo Curv 2 Flow: ora lava con un rullo
Roborock Qrevo Curv 2 Flow: ora lava con un rullo
Qrevo Curv 2 Flow è l'ultima novità di casa Roborock per la pulizia di casa: un robot completo, forte di un sistema di lavaggio dei pavimenti basato su rullo che si estende a seguire il profilo delle pareti abbinato ad un potente motore di aspirazione con doppia spazzola laterale
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite
Abbiamo guidato per diversi giorni la Alpine A290, la prima elettrica del nuovo corso della marca. Non è solo una Renault 5 sotto steroidi, ha una sua identità e vuole farsi guidare
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile
Abbiamo provato a fondo il nuovo Magic 8 Lite di HONOR, e per farlo siamo volati fino a Marrakech , dove abbiamo testato la resistenza di questo smartphone in ogni condizione possibile ed immaginabile. Il risultato? Uno smartphone praticamente indistruttibile e con un'autonomia davvero ottima. Ma c'è molto altro da sapere su Magic 8 Lite, ve lo raccontiamo in questa recensione completa.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 07-01-2007, 14:41   #1
thebol
Senior Member
 
Iscritto dal: Dec 2000
Città: bologna
Messaggi: 1309
Mock or not to Mock?

Ho provato a introdurre il TDD dove lavoro in piccoli componenti che dovevo modificare e per semplicità ( ) ho rifatto da zero. Questi componenti vengono usati da delle action di struts(per chi non le conosce delle servlet), e devono accedere a DB.

Si è posto il problema come usare l'accesso a db nei test. Ho deciso di Mockare l'accesso al db, e fin qua + o - tutto chiaro(anche se la soluzione non mi soddisfaceva + di tanto, forse sarebbe piu semplice un db in memory fatto apposta per i test...).

Però è sorto un problema. Dentro il componente creavo la connesione a db, cioè un oggetto(new DBConnect(...) ).

Problema:
Visto che io devo testare il componente, e questo crea l'oggetto che rappresenta la connesione al db, come faccio a dirgli di usare la connesione fake?

Naturalmente si può passare la connesione al componente come parametro(in creazione, o nel metodo che fa il lavoro).
Ma questo vuol dire che per testare un componente in pure isolation, questo non deve creare oggetti(o almeno oggetti che ne possono alterare il funzionamento, e che si prestano a essere mockati).

Questo crea problemi ad esempio, quando io voglio testare la action che usa il mio componente. La action ha la particolarità di essere chiamata dall'application server, percui non posso alterarne i parametri di creazione(a meno di fare cambiamenti strutturali che coinvolgerebbero tutte le action dell'applicazione)
In questo caso le soluzioni sarebbero 2:
La action usa il mio componente in una certa maniera, io mocko il mio componente e verifico che vengano effetuate le giuste chiamate con i giusti parametri. Questo non si può fare perchè il componente viene creato all'interno della action.

Oppure:
Mocko il db, e lo passo al mio componente. Non posso perchè la connesione al db o la crea il mio componente(che non posso mockare), oppure la passa la action al mio componente.Ma sto testando la action, e come faccio a dirgli di passare il db mockato invece di quello reale?


Il mock è percio molto utile quando qualcosa di complesso (il db, l'accesso ai file, alla rete, etc) viene passato a un componente, ma viene meno utile quando questo viene usato.

Certo nel mio esempio, si sarebbe potuto ristrutturare il meccansimo delle action, in modo da fare una action personalizzata a cui passare la connesione al db. Però nel mio caso era impossibile stando io testando solo una piccola parte dell'applicazione.

Tutto questo discorso per chiedervi o sentire opinioni sui mock, o meglio, su questa presunta (da me) limitiazione dei mock.





ps. Nel applicazione reale in un punto ho risolto il problema grazie al fatto che si usavano dei singletone. C'era un associazione stringa-> Classe per la connesione. Ho sostiutito la classe base, con quella mockata e ho risolto. Però in un altro punto non ci sono riuscito :|

pps so che il post è contorto, spero che qualcuno lo capisca
thebol è offline   Rispondi citando il messaggio o parte di esso
Old 07-01-2007, 15:04   #2
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
hai scordato un "To" nel titolo
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 07-01-2007, 15:30   #3
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Poichè ogni classe Java è caricata dinamicamente, potresti lasciare il codice inalterato e rimpiazzare la classe DBConnection "vera" con il suo mock attraverso il classpath.

Per sintetizzare in "jarrese", useresti i mock con:

java -cp .;Mocks.jar -jar Applicazione.jar

e i "real" con:

java -cp .;Reals.jar -jar Applicazione.jar

Mocks e Components conterrebbero due diversi DBConnection, uno mock e l'altro real, binariamente compatibili. Applicazione.jar sarebbe il pacchetto di tutto ciò che non è DBConnection ma eventualmente usi questa classe.

All'atto pratico il tutto è "facilmente" controllabile con i task di ant.

Non sono tuttavia sicuro che questo sia rigoroso dal punto di vista del TDD perchè usi una caratteristica che è propria di alcune specie di linguaggi, Java Smalltalk, Python, Ruby eccetera, ma non di altri, C++, C eccetera, limitazione che il TDD certamente non impone.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 07-01-2007, 23:12   #4
thebol
Senior Member
 
Iscritto dal: Dec 2000
Città: bologna
Messaggi: 1309
Quote:
Originariamente inviato da 71104
hai scordato un "To" nel titolo
cazz ero convinto che nel primo non ci andasse ma gugol ti da ragione
thebol è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Roborock Qrevo Curv 2 Flow: ora lava con un rullo Roborock Qrevo Curv 2 Flow: ora lava con un rull...
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite Alpine A290 alla prova: un'auto bella che ti fa ...
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile Recensione HONOR Magic 8 Lite: lo smartphone ind...
Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora Sony WF-1000X M6: le cuffie in-ear di riferiment...
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI Snowflake porta l'IA dove sono i dati, anche gra...
AOC propone un QD-OLED al prezzo di un I...
AGCOM segnalerà la AI Mode di Goo...
L'Estonia porta ChatGPT in classe: firma...
2 nm giapponesi contro TSMC: il piano di...
Questa scopa elettrica Tineco iFLOOR 5 è...
FRITZ!Box 6825 4G sbarca in Italia a 129...
Red Hat presenta Digital Sovereignty Rea...
AMD Zen 6 'Olympic Ridge': sette configu...
Amazon batte Walmart dopo 30 anni: il so...
Digos nel mirino dell'intelligence cines...
Sony non vuole aumentare il prezzo della...
Energia geotermica: la (costosa) rispost...
MG ha già venduto 1 milione di au...
"Something Big Is Happening" —...
Renault chiude il 2025 con una perdita r...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 06:16.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v