5 回答

TA貢獻1817條經驗 獲得超6個贊
當你調用特定值時,你必須用ArgumentMatchers.eq()
. 但是,您也可以使用anyString()
,any(Class class)
和其他。它們都是不言自明的。模擬教程。
@Before
public void init (){
MockitoAnnotations.initMocks(this);
HttpEntity <?> request = new HttpEntity<>(reqPayload, headers);
Mockito.when(restTemplate.getForEntity(ArgumentMatchers.eq("theUrl"),ArgumentMatchers.any(Map.class)))
.thenReturn(new ResponseEntity <Map>(someMap, HttpStatus.OK));
}
關于你的結構。這樣你就可以RestTemplate通過構造函數注入。
public class ServiceTester {
@Mock
private RestTemplate restTemplate;
private Service service;
@Before
public void init (){
MockitoAnnotations.initMocks(this);
service = new Service(restTemplate);
HttpEntity <?> request = new HttpEntity<>(reqPayload, headers);
Mockito.when(restTemplate.getForEntity(ArgumentMatchers.eq("theUrl"),ArgumentMatchers.any(Map.class)))
.thenReturn(new ResponseEntity <Map>(someMap, HttpStatus.OK));
}
}
class Service {
private RestTemplate template;
@Autowired
public Service(RestTemplate template) {
this.template = template;
}
public Map doSomething () {
// do something with template
}
}

TA貢獻1890條經驗 獲得超9個贊
我嘲笑這樣的休息模板
@RunWith(SpringRunner.class)
public class Clazz {
@Mock
private RestTemplate restTemplate;
}
所以嘗試使用 SpringRunner 而不是 MockitoRunner 也許它會起作用

TA貢獻1779條經驗 獲得超6個贊
您確定要特別模擬 restTemplate 嗎?
不模擬 restTemplate 而是模擬答案怎么樣?
它還可以幫助您測試 restTemplate 行為。如果 restTemplate 得到 404 或 500 怎么辦?
這就是為什么我建議你使用MockRestServiceServer
它有助于檢查所有真實場景。

TA貢獻1802條經驗 獲得超5個贊
你必須注入RestTemplate你的服務SomeService。目前,您正在服務中創建一個新實例。這意味著,您沒有獲得 的模擬實例RestTemplate,但獲得了真實類的全新實例RestTemplate。
你必須做這樣的事情:
class SomeService
{
@Inject
private RestTemplate restTemplate;
//some private, static, final data members
public Map getService(String sNo, String uId, String en)
{
ResponseEntity <Map> response = restTEmplate.getForEntity("https://someurl.com/someService",
Map.class);
...
}
}

TA貢獻1856條經驗 獲得超11個贊
如果您有權更改 SomeService 類,我建議您執行以下操作。
class SomeService
{
//some private, static, final data members
public Map getService(String sNo, String uId, String en)
{
ResponseEntity <Map> response = getForEntity("https://someurl.com/someService", Map.class);
Map body = response.getBody();
//do something
HttpEntity<?> request = new HttpEntity <>(payLoad, headers);
//payload is Hash Map and headers is a LinkedMultiValueMap
ResponseEntity <Map> response = postForEntity(url, request, headers);
return response.getBody();
}
}
正如您可能已經猜到的getForEntity那樣,postForEntity方法已經被提取出來,RestTemplate 在其中被實例化——秘密地完成它的工作。既然你想從一開始就模擬 RestTemplate,我們擺脫它是一件好事——現在我們可以在沒有任何對象模擬的情況下監視我們的服務。
@RunWith(MockitoJunitRunner.class)
class TestSomeService
{
@InjectMocks
@Spy
SomeService ser;
/*Some data members*/
@Before
{
HttpEntity <?> request = new HttpEntity<>(reqPayload, headers);
doReturn(new ResponseEntity <Map>(someMap, HttpStatus.OK))
.when(ser).getForEntity("theUrl", Map.class));
doReturn(new ResponseEntity <Map>(expectedMap, HttpStatus.OK))
.when(ser).postForEntity("anotherUrl", request, Map.class));
}
@Test
public void testGetService()
{
Map <String, Object> result = ser.getService("123", "abc", "QA");
}
}
添加回答
舉報