Adott osztályon belüli osztály mock-olása.

Fórumok

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.

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

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!

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?).

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!

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.

"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

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.

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

nekem a

.withAnyArguments()

-cel sosem volt szerencsém.

.withNoArguments()

, vagy

.withArguments(obj1, obj2)

-vel igen, s sosem másztam mélyen bele.
--
blogom