2013-08-21 24 views
5

Mam następujące klasy Java:Zagnieżdżony metoda wyśmianie w Mockito

public class A 
{ 
    @Autowired 
    private B b; 
    public int aFn() 
    { 
     int something = b.bFn(); 
    } 
} 
public class B 
{ 
    @Autowired 
    private C c; 
    public int bFn() 
    { 
     int something = c.cFn(); 
    } 
} 
public class C 
{ 
    public int cFn() 
    { 
     return 231; 
    } 
} 

a następujący test używając Mockito przetestować powyższy kod:

public class test 
{ 
    @Autowired 
    private A a; 

    private C c; 

    @Test 
    public void testA() 
    { 
     c = mock(C.class); 
     when(c.cFn(),anyInt()).thenReturn(something); 
     assertEquals(0, a.aFn()); 
    } 
} 

Kiedy debugowanie Testa, uważam, że prawdziwa c.Cfn() zostaje wykonana, a nie wyśmiewana. Czy jest coś, co robię niewłaściwie tutaj? Proszę o pomoc!

Odpowiedz

8

Przede wszystkim powinieneś zawsze kpić z bezpośrednich zależności obiektu, a nie z jego przejściowych zależności. Powinniście więc wyśmiać B, a nie C, aby przetestować A. Następnie moglibyście napisać test jednostkowy dla B przez kpiny C.

Po drugie: nie wstrzykujecie fałszywego nigdzie w teście jednostkowym. Co trzeba mieć to:

public class Test { 

    // not autowired here 
    private A a; 

    private B mockB; 

    @Test 
    public void testA() { 
     mockB = mock(B.class); 
     when(b.bFn(), anyInt()).thenReturn(something); 

     // the missing part: injecting the mock into the tested object 
     a = new A(mockB); 
     // or a = new A(); 
     // a.setB(mockB); 

     assertEquals(0, a.aFn()); 
    } 
} 

Podczas korzystania makiety (B.class), można uzyskać jedną mock wystąpienie B. To nie znaczy, że wszystkie pozostałe przypadki B będą robić to, co robi makiety.

Kpiny z testu A to zła praktyka: testy jednostkowe powinny przetestować jedną klasę w izolacji pozostałych. Ale jeśli naprawdę tego chcesz, stwórz fałszywą C, stwórz B i wstrząśnij w niej pozorowaną C, następnie stwórz A i wstrzyknij B w nią.

A --> B --> mockC 
+0

Chcę użyć kodu pośredniczącego c.cFn, a nie b.bFn. Co należy zrobić w tym celu? – user1471283

+0

To jest zła praktyka. Testy jednostkowe powinny przetestować jedną klasę w izolacji pozostałych. Ale jeśli tego chcesz, stwórz fałszywą C, stwórz B i wstrząśnij w niej pozorowaną C, następnie stwórz A i wstrzyknij B wewnątrz. 'A -> B -> mockC'. –

+0

Dzięki. Zmodyfikuj swoją odpowiedź zgodnie z tym. – user1471283