在另一个中使用一个模拟调用的结果

Use result of one mock call in another

如何 use/inject 将一个 mock 的结果转换为另一个?

我想我做错了

int 参数始终为 null

我用spy是因为我测试的方法无效。 我可以使用 mockito 来完成吗?

@RunWith(MockitoJUnitRunner.class)
public class Test {

    @Mock
    Utils utils;

    @Mock
    Custom custom;

    @Spy
    @InjectMocks
    MyService service;

    @Test
    public void test(){
        Mockito.when(utils.get("p")).thenReturn(1); //use result of it in the next mock call

        Mockito.when(custom.isValid(1)).thenReturn(true); //custom use 1 here
        Mockito.doCallRealMethod().when(service).doIt("p");

        service.doIt("p");

        Mockito.verify(service,Mockito.times(1)).doIt("p");
    }
}
@Service
public class MyService {
    Utils utils;
    Custom custom;

    public MyService(Utils utils) {
        this.utils = utils;
    }

    public void doIt(String value){
        int param = utils.get(value);

        if(custom.isValid(param)){
            //do it
        }
    }
}

您实际上不需要监视 MyService。您可以简化测试并使其正常工作:

@RunWith(MockitoJUnitRunner.class)
public class Test {

   @Mock
   Utils utils;

   @InjectMocks
   MyService service;

    @Test
    public void test(){
        // Arrange
        Mockito.doReturn(1).when(utils.get("p"));
        Mockito.when(custom.isValid(1)).thenReturn(true);

        // Act
        service.doIt("p");

        // Assert
        Mockito.verify(utils, Mockito.times(1)).get("p");
        // You should also confirm that whatever is done in `if(param==1)` is actually done
    }
}

您在模拟时使用了错误的参数,请像这样更改您的测试:

public class Test {

   @Mock
   Utils utils;

   @InjectMocks
   MyService service;


   @BeforeEach
   void setUp(){
     initMocks(this);
   }

   @Test
   public void test(){  
       Mockito.when(utils.get(any())).thenReturn(1);

       service.doIt("p");

       Mockito.verify(utils).get(any());
   }
}

相反 any() 您可以放置​​任何其他变量,但它应该是与您调用服务的变量相同的变量