Mockito thenReturn returns same instance

后端 未结 3 432
孤街浪徒
孤街浪徒 2021-02-04 00:03

I have this in Mockito:

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


        
相关标签:
3条回答
  • 2021-02-04 00:06

    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());

    0 讨论(0)
  • 2021-02-04 00:17

    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.

    0 讨论(0)
  • 2021-02-04 00:19

    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();
         }
       });
    
    0 讨论(0)
提交回复
热议问题