Utilisation Mockito 2.0.7 pour se moquer des expressions lambda
Je veux simuler une requête fournie sur mon référentiel comme ceci:
@Test
public void GetByEmailSuccessful() {
//setup mocks
Mockito.when(this.personRepo.findAll()
.stream()
.filter(p -> (p.getEmail().equals(Mockito.any(String.class))))
.findFirst()
.get())
.thenReturn(this.personOut);
Mockito.when(this.communityUserRepo.findOne(this.communityUserId))
.thenReturn(this.communityUserOut);
...
Mon @Before
méthode ressemble à ceci:
@Before
public void initializeMocks() throws Exception {
//prepare test data.
this.PrepareTestData();
//init mocked repos.
this.personRepo = Mockito.mock(IPersonRepository.class);
this.communityUserRepo = Mockito.mock(ICommunityUserRepository.class);
this.userProfileRepo = Mockito.mock(IUserProfileRepository.class);
}
Malheureusement quand je lance le test, je reçois l'erreur:
java.util.NoSuchElementException: Aucune valeur présente
Quand je double-cliquez sur l'erreur, il de points à la .get()
méthode de la première lambda.
N'avez-vous réussi à se moquaient d'une expression lambda et savoir comment je peux résoudre mon problème?
- J'ai peut-être tort, mais je pense que vous devez spécifier une valeur de retour pour
personRepo.findAll()
d'abord, et ensuite pour tous les appels de méthode. - J'ai la mauvaise impression que vous souhaitez tester mockito au lieu de tester votre code. Quel est le code de getByEmail()? Que doit-elle faire?
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas besoin de se moquer une telle profondeur d'appels. Tout simplement se moquer de
personRepo.findAll()
et de laisser le Streaming API travail comme d'habitude:Et puis, au lieu de
.filter(p -> (p.getEmail().equals(Mockito.any(String.class))))
juste set/maquette
email
sur votrePerson
objets à la valeur attendue.Sinon, envisager la mise en œuvre
PersonRepo.findByEmail
.Deux choses:
Tout d'abord, vous êtes en essayant de simuler une chaîne de cinq différents appels de méthode. Mockito ne gère pas très bien; bien que le
RETURNS_DEEP_STUBS
réponse (si mis sur personRepo) permettrait d'économiser et de retour des objets de talon le cas échéant, chaque appel àwhen
sera lui-même stub exactement un appel.Deuxième, Mockito les allumettes ne sont pas assez flexibles pour travailler profondément dans les appels, les appels à
when
doit contenir exactement un seul appel de méthode sans chaînage, et les appels à Mockito les allumettes commeany
devrait représenter exactement l'un des arguments dans la méthode. La façon dont vous l'avez, vous êtes en train de créer un prédicatp -> (p.getEmail().equals(null))
et en laissant un matcher sur la pile de casser des choses plus tard.Utilisation Alex Wittig réponse pour résoudre ce problème, et être conscient de stubbing et à l'aide de rapprochement correctement dans l'avenir des problèmes.