Jak użyć Mockito do testów tak słabego kodu ?

0

Fragment kodu:


class A {
public Brt cannotW( Em em, War war, long a, Brt brt) {     

            Brt ret = null;

            try { 
                  int l = 0;

                  for ( P p : war.getWars() ) {  //war moge latwo zamokowac i przekazac do tej metody (cannotW) juz mocka ze zdefiniowanym zachowaniem dla getWars.

                       ...

                  }
				  
                  if ( l > 0 ) {

                        U u = U.getSth().find(em, war.getUid()); //czy da się przy pomocy mockito jakos podmienic 'u' na mocka, bez poteznej ingerencji w kod tej metody ?

                        String sth = findSth(em, war, u); //jak zamockowac zachowanie findSth ? jedyne co przychodzi mi do glowy, to po prostu zrobic Mockito.spy na klasie A i testowac metode cannotW z "tego spy'ia" podmieniajac jedynie findSth jakas zaslepka ?
				...
				}
				
	.........
	}
}



Pytania w komentarzach. Ogolnie chcialbym moc przetestowac taki ciezki kod, mockujac wszelkie zaleznosci, bez znacznej ingerencji w kod tej metody, czy da sie to zrobic :P ?

0

Do mockowania statycznych metod możesz użyć PowerMocka.

0

Ok, ale jesli koniecznie chce uzyc Mockito ?

czy to (ponizsze) jest realne, testowanie "spaja" z podmiana findSth ?

String sth = findSth(em, war, u); //jak zamockowac zachowanie findSth ? jedyne co przychodzi mi do glowy, to po prostu zrobic Mockito.spy na klasie A i testowac metode cannotW z "tego spy'ia" podmieniajac jedynie findSth jakas zaslepka ?

jesli tak, to wywolanie statycznej metody aby uzyskac U -> moglbym opakowac metoda wewnatrz klasy A i podobnie jak wyzej zaspajaowac :P

czy moje pytanie jest czytelne :P ?

0

Powermock pozwala mockowac statici.

0

Nie udało mi się nigdy podmienić metody w Spy (chętnie bym to zobaczył, nie wiem czy tak się da). Spy natomiast używałem, aby zweryfikować interakcje testowanego obiektu (podczas testowania legacy kodu). W normalnych okolicznosciach oczywiscie interakcje weryfikuje na mockach, a nie testowanym obiekcie (z dodatkiem spy). Jak sie uda napisz jak to zrobiles.

Koniecznie chcesz uzyc Mockito (zamiast PowerMock) poniewaz nie masz mozliwosci modyfikacji zaleznosci w projekcie?

1

ogolnie tak, musze uzyc mockito

co do podmiany, przyklad z neta dla spy:

@Spy
List<String> spiedList = new ArrayList<String>();

@Test
public void whenUseSpyAnnotation_thenSpyIsInjected() {
    spiedList.add("one");
    spiedList.add("two");
 
    Mockito.verify(spiedList).add("one");
    Mockito.verify(spiedList).add("two");
 
    assertEquals(2, spiedList.size());
 
    Mockito.doReturn(100).when(spiedList).size();
    assertEquals(100, spiedList.size());
}

dzieki spy moge uzywac spiedList jak prawdziwej listy i podmienic jej zachowanie dla metody size.

Tak ja myslalem zrobic Spy na klasie A, przetestowac z tego "spaja" realna metode cancelWar (nie mock !), w ten sposob ze podmienie implementacje dla findSth. (Analogicznie jak powyzej z dokumetnacji)

*cancelWar = cannotW

  • ze podmienie implementacje dla findSth. -> nie tyle podmienie implementacje, a okresle co tam metoda ma zwrocic
0

To się wydaje dobrym pomysłem, jeśli celem jest po prostu refactoring. W okolicznościach tworzenia nowego rozwiązania fragmenty nietestowalne bez PowerMock np. static zdarzało mi się opakowywać we wrappery podawane za pomocą DI (które dzięki temu mogłem mockować na potrzeby testu).

1 użytkowników online, w tym zalogowanych: 0, gości: 1