在另一个中使用一个模拟调用的结果
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()
您可以放置任何其他变量,但它应该是与您调用服务的变量相同的变量
如何 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()
您可以放置任何其他变量,但它应该是与您调用服务的变量相同的变量