簡體   English   中英

如何從 Mockito Junit 正確調用超級 class 方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM