简体   繁体   中英

Mockito thenReturn returns same instance

I have this in Mockito:

when(mockedMergeContext.createNewEntityOfType(IService.class)).thenReturn(new ServiceMock());

The createNewEntityOfType method should always return a new ServiceMock instance but it returns twice the same reference.

Why the thenReturn method doesn't return new ServiceMock ?

The thenReturn method will always return what is passed to it. The code new Servicemock() is being executed prior to the call to thenReturn . The created ServiceMock is then being passed to thenReturn . Therefore thenReturn has a absolute instance of ServiceMock not a creation mechanism.

If you need to provide an new instance, use thenAnswer

when(mockedMergeContext.createNewEntityOfType(IService.class))
  .thenAnswer(new Answer<IService>() {
     public IService answer(InvocationOnMock invocation) {
        return new ServiceMock();
     }
   });

You might want to refactor that into different statements to understand why that happens.

Service svc = new ServiceMock();
when(mockedMergeContext.createNewEntityOfType(IService.class)).thenReturn( svc );

Do you see now why it doesn't work? :)

It's always returning the instance hold in svc, it won't re-evaluate new ServiceMock() each time that the method is invoked.

In Java 8 with Lambdas you can just use

when(mockedMergeContext.createNewEntityOfType(IService.class)).thenAnswer(invocation -> new ServiceMock());

So just replace .thenReturn(new MyMock());

with .thenAnswer(invocation -> new MyMock());

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM