根據我對模擬的理解,測驗不應該深入到被模擬的 bean 中。例如,控制流不應該進入函式apiService.getSomeData(),而應該只回傳字串“Hello there”。但這是模擬的作業方式還是程式繼續深入,我應該能夠getSomeData()在標準輸出中看到列印陳述句嗎?
當我實際運行下面的代碼時,它并沒有更深入。但這是它應該如何作業的嗎?
假設這是 Rest Controller 代碼:
@RestController
@RequestMapping(value = "/testing")
public class ApiController {
@Autowired
ApiService service;
@PostMapping(path = "/events/notifications",consumes = "application/json", produces = "application/json" )
public ResponseEntity<String> checkMapping(@Valid @RequestBody String someData, @RequestHeader(value="X-User-Context") String xUserContext) throws Exception {
String response = service.getSomeData(someData);
return ResponseEntity.status(HttpStatus.OK).body(response);
}
}
假設這是控制器測驗代碼:
@WebMvcTest(ApiController.class)
public class ApiControllerTest {
@Autowired
MockMvc mockMvc;
@Autowired
ObjectMapper mapper;
@MockBean
ApiService apiService;
@Test
public void testingApi() throws Exception {
Mockito.when(apiService.getSomeData("")).thenReturn("Hello there");
MockHttpServletRequestBuilder mockRequest = MockMvcRequestBuilders.post("/testing/events/notifications")
.contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON)
.header("X-User-Context","something")
.content("something");
mockMvc.perform(mockRequest)
.andExpect(status().isBadGateway());
}
}
假設這是 Api 服務代碼:
@Service
public class ApiServiceImpl implements ApiService{
@Override
public String getSomeData(String data) throws Exception {
System.out.println("Going deeper in the program flow);
callThisFunction();
return "Some data";
}
public void callThisFunction(){
System.out.println("Going two levels deeper");
}
}
uj5u.com熱心網友回復:
在您的測驗中,您根本沒有與之交談ApiServiceImpl,而是一個由 mockito 創建的實體,它也在實作ApiService介面。因此,您的實作getSomeData()根本不會執行。這就是嘲笑的意義所在。你為你不想被執行的東西創建一個“模擬”實作(或者讓一個像mockito這樣的工具為你做這件事)并注入它而不是“真實”的東西。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/470381.html
