在上篇博客https://blog.csdn.net/cml_blog/article/details/82820753介紹了SpringBoot中進行單元測試各種小技巧後,發現還有個遺漏的case,那就是在使用的mock的時候,可能需要根據不同的參數返回不同的數據。比如傳入aa返回true,傳入bb返回false等情況,這裏再補充一篇進行說明。
首先還是在AService中新增doSmthing2
@Component
public class AService {
//略....
public String doSmthing2(String key) {
return "doSmthing2:" + key;
}
}
在單元測試的時候,如果使用到了AService.doSmthing2方法,希望傳入不同參數時返回不同的mock數據,那麼就可以使用Mockito.argThat進行數據的自定義返回:
@RunWith(SpringRunner.class)
public class MockSelectorTest {
@Mock
private AService aService;
@Test
public void testMock() {
Mockito.when(aService.doSmthing2(Mockito.anyString())).thenReturn("mockValue");
assert aService.doSmthing2("value").equals("mockValue");
}
@Test
public void testSelector() {
//默認返回
Mockito.when(aService.doSmthing2(Mockito.any())).thenReturn("mockANYValue");
Mockito.when(aService.doSmthing2(Mockito.argThat(arg -> "aa".equals(arg)))).thenReturn("mockAAAValue");
Mockito.when(aService.doSmthing2(Mockito.argThat(arg -> "bb".equals(arg)))).thenReturn("mockBBBValue");
assert "mockAAAValue".equals(aService.doSmthing2("aa"));
assert "mockBBBValue".equals(aService.doSmthing2("bb"));
assert "mockANYValue".equals(aService.doSmthing2("cc"));
assert "mockANYValue".equals(aService.doSmthing2(null));
}
@Test
public void testSelectorMockitoHamcrest() {
//默認返回
Mockito.when(aService.doSmthing2(Mockito.any())).thenReturn("mockANYValue");
Mockito.when(aService.doSmthing2(MockitoHamcrest.argThat(new BaseMatcher<String>() {
@Override
public boolean matches(Object item) {
return "aa".equals(item);
}
@Override
public void describeTo(Description description) {
}
}))).thenReturn("mockAAAValue");
Mockito.when(aService.doSmthing2(MockitoHamcrest.argThat(new BaseMatcher<String>() {
@Override
public boolean matches(Object item) {
return "bb".equals(item);
}
@Override
public void describeTo(Description description) {
}
}))).thenReturn("mockBBBValue");
assert "mockAAAValue".equals(aService.doSmthing2("aa"));
assert "mockBBBValue".equals(aService.doSmthing2("bb"));
assert "mockANYValue".equals(aService.doSmthing2("cc"));
assert "mockANYValue".equals(aService.doSmthing2(null));
}
}
以上代碼已經提交到工程:LearnTest
SpringBootLearning是對springboot學習與研究項目,是根據實際項目的形式對進行配置與處理,歡迎star與fork。
[oschina 地址]
http://git.oschina.net/cmlbeliever/SpringBootLearning
[github 地址]
https://github.com/cmlbeliever/SpringBootLearning