[英]How to call super class method correctly from Mockito Junit
我有一個基礎處理程序
public class BaseHandler {
protected Object extractInput(RoutingContext rc) {
JsonObject jsonObject = new JsonObject();
jsonObject.put("baseKey", "baseValue");
return jsonObject
}
}
還有一個兒童處理程序
public class ChildHandler extends BaseHandler {
@Override
protected Object extractInput(RoutingContext rc) {
JsonObject jsonObject = (JsonObject) super.extractInput(rc);
populateFileObjects(rc).ifPresent(jsonArray -> json.put("fileUploads", jsonArray));
return jsonObject
}
}
我已經使用 Mockito 編寫了 Junit 代碼
@Test
public void extractInputTest() {
ChildHandler handler = spy(new ChildHandler());
RoutingContext rc = mock(RoutingContext.class);
JsonObject jsonObject = new JsonObject();
jsonObject.put("key", "value");
JsonArray jsonArray = new JsonArray();
JsonObject fileObject = new JsonObject();
fileObject.put("fileName", "name");
jsonArray.add(fileObject);
Optional<JsonArray> optional = Optional.of(jsonArray);
doReturn(jsonObject).when((BaseHandler)handler).extractInput(eq(rc));
doReturn(optional).when(handler).populateFileObjects(rc);
Object o = handler.extractInput(rc);
Map<String, Object> map = ((JsonObject) o).getMap();
Assert.assertEquals("value", ((JsonObject)o).getString("key"));
Assert.assertEquals(2, map.size()); //Junit fails here
Assert.assertEquals(JsonArray.class, map.get("fileUploads").getClass());
Assert.assertEquals(fileObject, ((JsonArray)map.get("fileUploads")).getJsonObject(0));
}
我嘗試在 ChildHandler 類的 extractInput 方法的第一行放置斷點,並觀察到它從未被調用過。
mocking super.method 調用的正確方法是什么?
有一種方法可以做到,但它不是很干凈,但它比用 Java 反射做同樣的臟東西要好。 您應該在您的孩子 class 的另一個方法中提取對超級方法的調用,例如:
public class ChildHandler extends BaseHandler {
@Override
protected Object extractInput(RoutingContext rc) {
JsonObject jsonObject = (JsonObject) superExtractInput(rc);
populateFileObjects(rc).ifPresent(jsonArray -> json.put("fileUploads", jsonArray));
return jsonObject
}
protected Object superExtractInput(RoutingContext rc){
super.extractInput(rc);
}
}
你的測試看起來像:
@Test
public void extractInputTest() {
ChildHandler handler = spy(new ChildHandler());
RoutingContext rc = mock(RoutingContext.class);
JsonObject jsonObject = new JsonObject();
jsonObject.put("key", "value");
JsonArray jsonArray = new JsonArray();
JsonObject fileObject = new JsonObject();
fileObject.put("fileName", "name");
jsonArray.add(fileObject);
Optional<JsonArray> optional = Optional.of(jsonArray);
doReturn(jsonObject).when(handler).superExtractInput(eq(rc));
doReturn(optional).when(handler).populateFileObjects(rc);
Object o = handler.extractInput(rc);
Map<String, Object> map = ((JsonObject) o).getMap();
Assert.assertEquals("value", ((JsonObject)o).getString("key"));
Assert.assertEquals(2, map.size()); //Junit fails here
Assert.assertEquals(JsonArray.class, map.get("fileUploads").getClass());
Assert.assertEquals(fileObject, ((JsonArray)map.get("fileUploads")).getJsonObject(0));
}
最好選擇組合而不是 inheritance ,以避免在測試階段出現此類問題。
這些課程就像:
public class BaseHandler {
protected Object extractInput(RoutingContext rc) {
JsonObject jsonObject = new JsonObject();
jsonObject.put("baseKey", "baseValue");
return jsonObject
}
}
public class ChildHandler{
private final BaseHandler baseHandler;
public ChildHandler(final BaseHandler baseHandler){
this.baseHandler = baseHandler;
}
@Override
protected Object extractInput(RoutingContext rc) {
JsonObject jsonObject = (JsonObject) baseHandler.extractInput(rc);
populateFileObjects(rc).ifPresent(jsonArray -> json.put("fileUploads", jsonArray));
return jsonObject
}
}
並且測試會更加清晰:
@InjectMocks
ChildHandler testObj;
@Mock
BaseHandler baseHandlerMock;
@Mock
RoutingContext routingContextMock;
@Test
public void extractInputTest() {
JsonObject jsonObject = new JsonObject();
jsonObject.put("key", "value");
JsonArray jsonArray = new JsonArray();
JsonObject fileObject = new JsonObject();
fileObject.put("fileName", "name");
jsonArray.add(fileObject);
Optional<JsonArray> optional = Optional.of(jsonArray);
when(baseHandlerMock.extractInput(routingContextMock)).thenReturn(routingContextMock);
doReturn(optional).when(handler).populateFileObjects(routingContextMock);
Object o = handler.extractInput(routingContextMock);
Map<String, Object> map = ((JsonObject) o).getMap();
Assert.assertEquals("value", ((JsonObject)o).getString("key"));
Assert.assertEquals(2, map.size()); //Junit fails here
Assert.assertEquals(JsonArray.class, map.get("fileUploads").getClass());
Assert.assertEquals(fileObject, ((JsonArray)map.get("fileUploads")).getJsonObject(0));
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.