2013-10-30 15 views
6

Ricevo eccezione del puntatore nullo anche dopo il mocking. Si prega di trovare la mia struttura del progetto.mockito - beffardo un'interfaccia - lancio di NullPointerException

//this is the pet interface 
    public interface Pet{ 
    } 

    // An implementation of Pet 
    public class Dog extends Pet{ 
     int id, 
     int petName; 

    } 
    // This is the Service Interface 
    public interface PetService { 
     List<Pet> listPets(); 
    } 

    // a client code using the PetService to list Pets 
    public class App { 
     PetService petService; 

     public void listPets() { 
      // TODO Auto-generated method stub 
      List<Pet> listPets = petService.listPets(); 
      for (Pet pet : listPets) { 
       System.out.println(pet); 
      } 
     } 
    } 

    // This is a unit test class using mockito 
    public class AppTest extends TestCase { 

     App app = new App(); 
     PetService petService = Mockito.mock(PetService.class); 
     public void testListPets(){ 
      //List<Pet> listPets = app.listPets(); 
      Pet[] pet = new Dog[]{new Dog(1,"puppy")}; 
      List<Pet> list = Arrays.asList(pet); 
      Mockito.when(petService.listPets()).thenReturn(list); 
      app.listPets(); 
     } 
    } 

Sto cercando di usare TDD qui, significa che ho l'interfaccia di servizio scritta, ma non l'effettiva attuazione. Per testare il metodo listPets(), so chiaramente che sta usando il servizio per ottenere l'elenco degli animali domestici. Ma la mia intenzione qui di testare il metodo listPets() della classe App, quindi sto cercando di deridere l'interfaccia del servizio.

Il metodo listPets() della classe App che utilizza il servizio per ottenere gli animali domestici. Quindi sto prendendo in giro quella parte usando mockito.

Mockito.when(petService.listPets()).thenReturn(list); 

Ma quando il test di unità è in funzione, perService.listPets() gettando NullPointerException che ho beffato impiegando il suddetto Mockito.when codice. Potresti per favore aiutarmi su questo?

+0

È necessario iniettare il finto nella vostra App, altrimenti App.petService sarà nulla quando si chiama listPets() – Morfic

+0

come fare? –

+0

È possibile utilizzare le annotazioni Mock e InjectMocks: maggiori dettagli qui http://stackoverflow.com/questions/19580197/injection-of-a-mock-object-into-an-object-to-be-tested-declared- as-a-field-in-th/19610215 # 19610215 – macias

risposta

5

NullPointerException è perché, in App, petService non viene istanziato prima di provare a utilizzarlo. Per iniettare il mock, in App, aggiungere questo metodo:

public void setPetService(PetService petService){ 
    this.petService = petService; 
} 

Poi nel test, chiamare:

app.setPetService(petService); 

prima di eseguire app.listPets();

9

È inoltre possibile utilizzare @InjectMocks annotazione, in questo modo si non avremo bisogno di getter e setter. Basta fare in modo di aggiungere di seguito nel tuo caso prova dopo l'annotazione la vostra classe,

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