起初我想抱歉我的英文。Mockito驗證單元測試 - 通緝但未調用。其實,這個模擬與零交互
我開始做一些單元測試(我從來沒有這樣做過,我是編程中的新人)。
考試我一定要簡單增加產品數據庫(DynamoDB)方法使用mockito.verify但我有
"Wanted but not invoked. Actually, there were zero interactions with this mock."
錯誤,我不知道該怎麼辦。
這是我的方法的代碼(在KitchenService類):
public Product addProduct(Product content) {
ObjectMapper objectMapper = new ObjectMapper();
String mediaJSON = null;
String authorJSON = null;
String productKindsJSON = null;
try {
mediaJSON = objectMapper.writeValueAsString(content.getMedia());
authorJSON = objectMapper.writeValueAsString(content.getAuthor());
productKindsJSON = objectMapper.writeValueAsString(content.getProductKinds());
} catch (JsonProcessingException e) {
logger.log(e.getMessage());
}
Item item = new Item()
.withPrimaryKey("id", UUID.randomUUID().toString())
.with("name", content.getName())
.with("calories", content.getCalories())
.with("fat", content.getFat())
.with("carbo", content.getCarbo())
.with("protein", content.getProtein())
.with("productKinds", productKindsJSON)
.with("author", authorJSON)
.with("media", mediaJSON)
.with("approved", content.getApproved());
Item save = databaseController.saveProduct(PRODUCT_TABLE, item);
logger.log(save + " created");
return content;
}
這是測試代碼:
@Test
public void addProduct() throws Exception {
KitchenService instance = mock(KitchenService.class);
Product expectedProduct = new Product();
expectedProduct.setName("kaszanka");
expectedProduct.setCalories(1000);
expectedProduct.setFat(40.00);
expectedProduct.setCarbo(20.00);
expectedProduct.setProtein(40.00);
expectedProduct.setProductKinds(Collections.singletonList(ProductKind.MEAT));
expectedProduct.setApproved(false);
Author expectedAuthor = new Author();
expectedAuthor.setId("testID");
expectedAuthor.setName("Endrju Golota");
expectedProduct.setAuthor(expectedAuthor);
Media expectedMedia = new Media();
expectedMedia.setMediaType(MediaType.IMAGE);
expectedMedia.setName("dupajasia");
expectedMedia.setUrl("http://blabla.pl");
expectedProduct.setMedia(expectedMedia);
verify(instance, times(1)).addProduct(expectedProduct);
}
這是我測試後得到:
Wanted but not invoked:
kitchenService.addProduct(
[email protected]
);
-> at service.kitchen.KitchenServiceTest.addProduct(KitchenServiceTest.java:80)
Actually, there were zero interactions with this mock.
有人能告訴我什麼我做錯了嗎?
你不應該嘲笑被測試的班級。如果有什麼可以嘲笑的話,那就是ObjectMapper –
那麼如何使用驗證並調用沒有kitchenservice實例的方法? 正確驗證的示例: verify(mock).someMethod(); (模擬,時間(10))。someMethod();驗證(模擬,atLeastOnce())。someMethod(); –
你的測試沒有意義。你在嘲笑你正在測試的東西。所以你沒有執行你的任何代碼。只有Mockito的代碼。創建一個假的東西,調用假的東西方法,並確認你已經調用了假的東西方法是沒有意義的。真正的代碼永遠不會被執行,你所做的只是使用假的東西。當你想測試A時,嘲笑是有用的,而A取決於B,而你使用假B來測試A.閱讀https://stackoverflow.com/a/28783849/571407獲取詳細解釋。 –