Jak przetestować taką metodę w mockito.

0

Witam,
Dopiero zaczynam uczyć cię mockito więc proszę o wyrozumiałość :) Mam taki przypadek, klasę abstract i w niej funkcję void.

public abstract class Klasa{
}

public class A {
public  void jakasfunkcja(int a, int,b, Klasa oblicz, int b);

}

Więc tak robię mocka do Klasa oblicz czyli:
@mock
Klasa oblicz

i następnie np. when(oblicz.funkcjalicz(anyInt())).thenReturn(100);
Pytanie jak ja mam to użyć do testu funkcji: void jakasfunkcja(int a, int,b, Klasa oblicz, int b);
Albo jak źle myślę jak to przetestować ? Proszę o jakieś naprowadzenie :)

0

Ale co ty chcesz testować skoro tu NIE MA KODU? o_O

0

Chodziło mi ogólnie jak testować taki przypadek z funkcją void która ma zmockowany parametr .

0

Zmocowana klase podajesz jako argument.

0
Krwawy Krawiec napisał(a):

Zmocowana klase podajesz jako argument.

Hmm to podaj przykład, że to działa :)

0

@Tomasz22 pokaż jakiś konkretny przykład, bo póki co to nie wiadomo co się w ogóle dzieje w tej twojej procedurze więc i trudno zasugerować jak to testować.

0

W dużym uproszczeniu:

public abstract class Klasa{
     public abstract boolean zwraca();
}
 
public class A {
   public  void jakasfunkcja(int a, int,b, Klasa oblicz, int b){
    if(oblicz.zwraca())
   { 
           System.out.println("Zwróciło true");

   }else
          System.out.println("Zwróciło false");
 
   }
}

Chodzi mi głównie to to jak po zmockowaniu tej klasy Klasa przetestować choćby taki prosty przypadek.
Mogę zrobić:
@mock
Klasa klasa;

I potem test czyli:
when(klasa.zwraca).thenReturn(true);
Tylko jak dalej tą void funkcję przetestować ?

0

Możesz sprawdzić czy metody zostały wywołane we właściwy sposób.

0

@Tomasz22 kod który pokazałeś nadal nie bardzo nadaje sie do testowania bo nadal nic nie robi ;] No ale załóżmy że zamiast printów coś tam się dzieje. Mozesz w takim razie ustawić oczekiwanie na to coś co sie tam dzieje i sprawdzić czy w zależności od wyniku mockowanego zwraca() wykonała się odpowiednia akcja czy też nie.

0

Ustawić oczekiwanie czyli ? Jak pisałem dopiero zaczynam z mockito. Jakieś naprowadzenie gdzie poczytać i gdzie szukać o tym :)

0
Tomasz22 napisał(a):

W dużym uproszczeniu:

public class A {
   public  void jakasfunkcja(int a, int,b, Klasa oblicz, int b)

Masz tutaj dwa bledy. Jeden zwiazany ze zdublowanym przecinkiem a drugi ze zdublowana nazwa zmiennej. Ogolnie to mozesz te klase przerobic na cos w stylu:

public class A {
    public  void jakasfunkcja(int a, int b, Klasa oblicz, int c) {
        if(oblicz.zwraca())
        {
            getOut().println("Zwróciło true");

        }else
            getOut().println("Zwróciło false");

    }

    protected PrintStream getOut() {
        return System.out;
    }
}
 

i pozniej w testach cos w stylu:

    @Test
    public void jezeliMetodaZwracaZwrociTrueToWypiszZwrociloTrueNaStandardoweWyjscie() {
        /**
         *
         * Przygotowanie testu
         *
         */
        Klasa oblicz = mock(Klasa.class);
        A a = spy(A.class);
        PrintStream out = mock(PrintStream.class);

        when(a.getOut())
                .thenReturn(out);

        when(oblicz.zwraca())
                .thenReturn(true);

        /**
         *
         * Wykonanie metody
         *
         */
        a.jakasfunkcja(
                5,          // jakas liczba
                8,          // jakas liczba
                oblicz,
                3);         // jakas liczba

        /**
         *
         * Sprawdzenie czy wszystko ok
         *
         */
        verify(oblicz).zwraca(); // czy metoda zwraca zostala w ogole wykonana?
        verify(out).println("Zwróciło true"); // czy odpowiedni tekst zostal wypisany na standardowe wyjscie
    }

    @Test
    public void jezeliMetodaZwracaZwrociFalseToWypiszZwrociloFalseNaStandardoweWyjscie() {
        /**
         *
         * Przygotowanie testu
         *
         */
        Klasa oblicz = mock(Klasa.class);
        A a = spy(A.class);
        PrintStream out = mock(PrintStream.class);

        when(a.getOut())
                .thenReturn(out);

        when(oblicz.zwraca())
                .thenReturn(false);

        /**
         *
         * Wykonanie metody
         *
         */
        a.jakasfunkcja(
                5,          // jakas liczba
                8,          // jakas liczba
                oblicz,
                3);         // jakas liczba

        /**
         *
         * Sprawdzenie czy wszystko ok
         *
         */
        verify(oblicz).zwraca(); // czy metoda zwraca zostala w ogole wykonana?
        verify(out).println("Zwróciło false"); // czy odpowiedni tekst zostal wypisany na standardowe wyjscie
    }
 

Mozesz tez to zrobic inaczej. Zamiast pisac metode getOut mozesz stworzyc sobie prywatne pole o nazwie np. out i pozniej wstawic mocka w to pole (mockito chyba tego nie potrafi wiec trzeba pewnie wykorzystac inne narzedzia). Metoda getOut powstala po to aby ominac problem z mockowaniem metod statycznych (mockito ma z tym problemy, ale juz PowerMock podobno daje rade). Potraktuj powyzszy kod jako pewny zarys - nie twierdze, ze nie da sie tego zrobic lepiej.

0

Ok dziękuję jak pojawią się pytania to pewnie zapytam :) Na razie to sobie przeanalizuję.

1

można też spróbować przechwycić standardowe wyjście tak jak tutaj:
http://stackoverflow.com/questions/8708342/redirect-console-output-to-string-in-java

public class Prynter {
    void prynt() {
        System.out.print("ok");
    }
}
public class PrynterTest {
    
    public PrynterTest() {
    }
    
    ByteArrayOutputStream baos = null;
    PrintStream old = null;
    
    @Before
    public void setUp() {
        // Create a stream to hold the output
        baos = new ByteArrayOutputStream();
        PrintStream ps = new PrintStream(baos);
        // IMPORTANT: Save the old System.out!
        old = System.out;
        // Tell Java to use your special stream
        System.setOut(ps);
    }
    
    @After
    public void tearDown() {
        // Put things back
        System.out.flush();
        System.setOut(old);
    }

    /**
     * Test of prynt method, of class Prynter.
     */
    @Test
    public void testPrynt() {
        Prynter instance = new Prynter();
        instance.prynt();
        assertEquals("ok", baos.toString());
    }
    
}

dla świętego spokoju użyłem print zamiast println bo miałem jakieś problemy z ostatnim znakiem ;)

0
Tomasz22 napisał(a):

Ustawić oczekiwanie czyli ? Jak pisałem dopiero zaczynam z mockito. Jakieś naprowadzenie gdzie poczytać i gdzie szukać o tym :)

Dla początkujących polecam "Practical Unit Testing with JUnit and Mockito" http://practicalunittesting.com/ oraz trochę bardziej systematyzujące samo podejście do testowania "Bad Tests, Good Tests" (darmowa) http://practicalunittesting.com/btgt.php

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