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?
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!!!
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());
}
}
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();