2015-02-11 11 views
8

ho un metodo nella classe AppleProcessor che vorrei prova:Mockito ClassCastException - Un finto non si può lanciare

public void process(Fruit fruit) { 
    if(fruit.getType() == Fruit.APPLE) { 
     fruitBasket.add(((AppleFruit) fruit).getApple()); 
    } 
    else { 
     // do something else 
    } 
} 

noti che frutta è un'interfaccia con il metodo getType() che AppleFruit attrezzi e ha anche una Metodo getApple().

Il mio test si presenta come:

@Mock 
FruitBasket fruitBasket; 

@Mock 
Fruit fruit; 

@Mock 
AppleFruit apple; 

@Before 
public void setUp() { 
    MockitoAnnotations.initMocks(this); 
} 

@Test 
public void testAnAppleIsProcessed() { 
    AppleProcessor appleProcessor = new AppleProcessoer(); 
    when(fruit.getType()).thenReturn(Fruit.APPLE); 
    when(((AppleFruit) fruit).getApple()).thenReturn(apple); 

    appleProcessor.process(fruit); 

    verify(fruitBasket).add(isA(Apple.class)); 
} 

Tuttavia ottengo il seguente errore:

java.lang.ClassCastException: package.fruit.Fruit$$EnhancerByMockitoWithCGLIB$$b8254f54 cannot be cast to package.fruit.AppleFruit

che proviene da questa linea nel test

when(((AppleFruit) fruit).getApple()).thenReturn(apple);

Would chiunque k ora come risolvere questo così posso testare il mio codice?

risposta

22

Quando si dice

@Mock 
Fruit fruit; 

Dite Mockito: la variabile fruit dovrebbe essere un esempio di Fruit. Mockito creerà dinamicamente una classe che implementa Fruit (questa classe è Fruit$$EnhancerByMockitoWithCGLIB$$b8254f54) e crea un'istanza di questa classe. Non c'è motivo per questa classe di essere un'istanza di AppleFruit, dal momento che non hai detto a Mockito che l'oggetto doveva essere di tipo AppleFruit.

Dichiararlo come AppleFruit e sarà di tipo AppleFruit.

+0

Grazie, il test funziona ora. – user2844485

0

Il tuo oggetto fittizio è migliorato da Mockito e non è uguale alla tua classe, quindi non puoi digitare cast.

+0

Quindi non c'è un modo per aggirarlo senza utilizzare un oggetto fittizio? – user2844485

+2

C'è sicuramente. Suggerirei di chiamare il metodo con l'istanza di appleFruit, non di frutta. –

Problemi correlati