Helosztok!
Segítségeteket szeretném kérni. Van egy adott osztáy (Elso.class) és ennek a konstruktorában létrehoz egy másik osztály (Masodik.class). Az elso osztályra kell írnom unit tesztet, de a második osztályt kellene mockolnom. Erre van valami megoldás?
Eddig ezt próbáltam:
Masodik m = mock(Masodik.class);
PowerMockito.whenNew(Masodik.class).withAnyArguments().thenReturn(m);
Elso e = new Elso();
De ez nem oldotta meg a problémám.
- 2757 megtekintés
Hozzászólások
Gondolom a belső osztály (Masodik.class) az egy member-je, az Elso.class-nak, ugye?
(ha nem akkor ezt módosítsd és akkor lehet ilyent pl.:)
Elso elso = new Elso();
Masodik mockMasodik = mock(Masodik.class);
Field masodikField = Elso.class.getDeclaredField("m_masodik");
masodikField.setAccessible(true);
masodikField.set(elso, mockMasodik);
és hurrá, az elso példány 'm_masodik' member-je most már a mockolt Masodik class
- A hozzászóláshoz be kell jelentkezni
Ebben az a gond, hogy az első sornál
Elso elso = new Elso();
Elszáll hibával. Szóval a dekralálásnál kellene rögtön mockolni a másodikat.
(Ha a konkrét kód jobban segítene, akkor a 83. sornál kéne a Mesh-t mockolnom:
https://github.com/Dgzt/buttonfootball/blob/master/core/src/main/java/c…
)
---------------------------
Oszt jónapot!
- A hozzászóláshoz be kell jelentkezni
Aha... igen ez a reflection-ös field módosítás akkor itt nem segít (főleg hogy final is a field :-S)...
Jó kérdés akkor, van hogy át kell írni a kódot kicsit hogy tesztelhetővé váljon, vagy máshogy tesztelni...
Erre így nincs most ötletem, (esetleg a teszt kódja is elérhető vhol?).
- A hozzászóláshoz be kell jelentkezni
Amit tesztelni szeretnék, az ez:
final Shape shape = new Shape(shader, GL20.GL_TRIANGLES, 4, new short[]{0,1,2,2,3,0}, Color.BLACK){};
shape.setVertices(new float[]{1.0f, 2.0f, 3.0f, 4.0f});
assertEquals(new float[]{1.0f, 2.0f, 3.0f, 4.0f}, shape.getVertices());
Sokra még nem jutottam ez ügyben.
Szerk: Githubra még nem akarom feltölteni, nem tudom hogy hova kéne az osztályt.
---------------------------
Oszt jónapot!
- A hozzászóláshoz be kell jelentkezni
Vmi ilyesmi megoldás szóba jöhet? (értelemszerűen nem teszteltem, csak így futnék neki)
http://pastebin.com/HTbVSF38
- A hozzászóláshoz be kell jelentkezni
Igen, így van jelenleg megoldva. :-)
---------------------------
Oszt jónapot!
- A hozzászóláshoz be kell jelentkezni
Ezt így nem fogod kimockolni. Amit tehetsz, hogy a Mesh példányosítást kiviszed egy factory methodba és azt mockolod. De a unit tesztelés nem azt jelenti, hogy feltétlenül kimockolunk mindent. Bár nem néztem meg a Mesh osztályt, lehet érdemes lenne mockolás nélkül tesztelni a Shapet, ha már ennyire el van rejtve a Mesh példány.
- A hozzászóláshoz be kell jelentkezni
Mesh osztály az a libGDX része, és libGDX64.dll hiányzott neki mindenáron. Sajnos unit tesztes példák és tutorialok elég ritkák a libGDX-hez és egyszerűbbnek tűnt mockolni, hisz elvileg csak az én kódomat akarom tesztelni.
---------------------------
Oszt jónapot!
- A hozzászóláshoz be kell jelentkezni
Az igazi megoldás elvileg az lenne, hogy át kell tervezni a kódot, hogy ne kelljen Mock-olni.
Épp most írtam erről egy rövid blog bejegyzést.
- A hozzászóláshoz be kell jelentkezni
OpenGL-es hívásokat használ az, amit mockolni kell(ett), így ezt nem lehet áttervezni. A cél az, hogy teszteknél ne legyen OpenGL-es hívások.
---------------------------
Oszt jónapot!
- A hozzászóláshoz be kell jelentkezni
Tetszőleges hívás lehet, attól még át lehet olyanra tervezni, hogy ne kelljen a Mock. Az egy másik kérdés, hogy úgy ítéled meg, hogy felesleges áttervezni, mert annyi pluszt nem hozna, mint amennyi időbe kerül.
- A hozzászóláshoz be kell jelentkezni
"Tetszőleges hívás lehet, attól még át lehet olyanra tervezni, hogy ne kelljen a Mock."
Egyelore csak a feleig jutottam a bejegyzesedben levo videonak, de felteszem a kerdest utt neked, mert gyanus, hogy a video hatralevo reszeben sem fogok valaszt kapni ra:
Van A osztalyunk, ami hasznalja B osztalyt. B osztaly egy interfesz egy kulso webszervizhez, nincs lokalis allapota. Hogyan fogod tesztelni A-t mock/stub/spy/test double/stb. nelkul? Nyilvan a unit tesztben nem mehet ki hivas a webszervizhez.
----------------------
"ONE OF THESE DAYS I'M GOING TO CUT YOU INTO LITTLE PIECES!!!$E$%#$#%^*^"
--> YouTube csatornám
- A hozzászóláshoz be kell jelentkezni
Készítek B-hez egy interface-t, legyen BInt, ahol a B implementálja a BInt-et. Az A a konstruktorában kapja meg a BInt-et. Tesztnél készítek egy nagyon egyszerű TestB-t, ami szintén implementálja a BInt-et és ezt adom át a tesztelendő A-nak.
Szerk.: Természetesen, ha olyan külső könyvtárakat kell használni, ahol nem fordítottak különösebb gondot a tervezésre, akkor fájó lehet plusz egy réteget a külső könyvtár osztályai köré rakni.
- A hozzászóláshoz be kell jelentkezni
Igen, ez a sajat Stub implementalasa, ahogy irtam a linkelt blogbejegyzesedben.
----------------------
"ONE OF THESE DAYS I'M GOING TO CUT YOU INTO LITTLE PIECES!!!$E$%#$#%^*^"
--> YouTube csatornám
- A hozzászóláshoz be kell jelentkezni
Ennek kb igy mukodnie kene. @RunWith(PowerMockRunner.class) es @PrepareForTest() annotaciok megvoltak? (Mar nem emlekszem, hogy Elso es Masodikat is meg kell-e adni ez utobbinal.)
----------------------
"ONE OF THESE DAYS I'M GOING TO CUT YOU INTO LITTLE PIECES!!!$E$%#$#%^*^"
--> YouTube csatornám
- A hozzászóláshoz be kell jelentkezni
Majd egy év távlatából már nem nagyon emlékszem, de végül így lett megoldva:
http://hup.hu/node/138592#comment-1928999
---------------------------
Oszt jónapot!
- A hozzászóláshoz be kell jelentkezni
nekem a
.withAnyArguments()
-cel sosem volt szerencsém.
.withNoArguments()
, vagy
.withArguments(obj1, obj2)
-vel igen, s sosem másztam mélyen bele.
--
blogom
- A hozzászóláshoz be kell jelentkezni