Utiliser @Mock et @ InjectMocks

J'étudie actuellement le framework Mockito et j'ai créé plusieurs cas de test en utilisant Mockito. Mais alors j'ai lu cela au lieu d'invoquer mock(SomeClass.classe), je peux utiliser les @Mock et le @InjectMocks - La seule chose que je dois faire est d'annoter ma classe de test avec @RunWith(MockitoJUnitRunner.class), ou utiliser le MockitoAnnotations.initMocks(this); dans le @Before méthode.

Mais cela ne fonctionne pas-il semble que le @Mock ne fonctionnera pas! Voici mes révisions de codes 2-une en utilisant les annotations et une Sans.

Ce que je fais de mal?

public class ReportServiceImplTestMockito {

    private TaskService       mockTaskService; // This is the Mock object
    private ReportServiceImpl service;

    @Before
    public void init(){
        service         = new ReportServiceImpl();
        mockTaskService = mock(TaskServiceImpl.class);
        service.setTaskServiceImpl(mockTaskService);
    }
/// ...

 Some tests
}

Comme je l'ai dit - ce travail grand. Mais ce qui suit l'habitude:

@RunWith(MockitoJUnitRunner.class)
public class ReportServiceImplTestMockito {

     @Mock 
     private TaskService      mockTaskService;

     @InjectMocks 
     private ReportServiceImpl service;

         // Some tests
}

Et voici la classe ReportServiceImpl:

@Service
public class ReportServiceImpl implements ReportService {

    @Autowired
    private TaskService taskServiceImpl;

    public ReportServiceImpl(){}

    public ReportServiceImpl(TaskService taskService){
        this.taskServiceImpl = taskService;
    }

    public void setTaskServiceImpl(TaskService taskServiceImpl) {
        this.taskServiceImpl = taskServiceImpl;
    }
}

Qu'est-ce que je manque?

34
demandé sur rjdkolb 2012-01-31 12:09:48

3 réponses

O. K, j'ai obtenu mon erreur!!! J'ai utilisé le @InjectMocks mais initialisé la même variable dans la méthode init ()... Donc, ce qui s'est passé, c'est que mockito a injecté les objets fictifs à ma variable - mais quelques secondes plus tard, je l'ai écrasé - en initialisant cette même variable!!!

24
répondu Noam 2012-03-27 09:45:08

Votre code fonctionne bien pour moi en utilisant Mockito 1.9.

En utilisant une version 1.8 + de Mockito, je reçois un message d'erreur très spécifique me disant exactement comment résoudre le problème. Comme le suggère php-coder: pour Mockito 1.8+, vous devez initialiser le champ.

Avez-vous vu ou tout autre message d'erreur?

Modifier:

Le code suivant fonctionne pour moi. Petits changements:

  • annotations de printemps supprimées
  • Interface Supprimée
  • Ajouté Getter
  • Ajouté vide TaskService
  • ajout d'un test avec System.out.println

Cela produit-il une erreur pour vous? :

Service:

public class ReportServiceImpl {

    private TaskService taskServiceImpl;


    public ReportServiceImpl() {

    }


    public ReportServiceImpl(TaskService taskService) {
        this.taskServiceImpl = taskService;
    }


    public void setTaskServiceImpl(TaskService taskServiceImpl) {
        this.taskServiceImpl = taskServiceImpl;
    }


    public TaskService getTaskServiceImpl() {
        return taskServiceImpl;
    }
}

Dépendance:

public class TaskService {

}

Test, impressions mockTaskService:

@RunWith(MockitoJUnitRunner.class)
public class ReportServiceImplTestMockito {

    @Mock
    private TaskService       mockTaskService;

    @InjectMocks
    private ReportServiceImpl service;


    @Test
    public void testMockInjected() {
        System.out.println(service.getTaskServiceImpl());
    }
}
12
répondu Arend v. Reinersdorff 2012-02-01 13:13:34

Je ne suis pas sûr, mais essayez de créer une nouvelle instance de ReportServiceImpl manuellement (comme vous l'avez fait dans l'exemple):

 @InjectMocks 
 private ReportServiceImpl service = new ReportServiceImpl();
3
répondu Slava Semushin 2012-01-31 08:31:35