簡體   English   中英

JMockit-無法將模擬類綁定到測試類

[英]JMockit - Can't bind mocked class to tested class

我有一個包含三層的應用程序:App <->圖形<-> Couchbase

我正在嘗試通過模擬Couchbase層並使用非常基本的內存中圖實現“替換”它來測試GraphConnector,使用JMockit 教程中演示的相同方法。

這是我的測試課(請原諒可憐的縮進,還沒有掌握):

public class GraphConnectorTest {
public static final class MockCouchbase extends MockUp<ICouchConnector> {
    private Map<String, CouchEntry> couch;

    @Mock
    public void $clinit() {
        couch = new HashMap<String, CouchEntry>();
    }

    @Mock
    public void put(CouchEntry entry) {
        couch.put(entry.getKey(), entry);
    }

    @Mock
    public CouchEntry get(String key) {
        return couch.get(key);
    }
}

GraphConnectorImpl graph = new GraphConnectorImpl();

@BeforeClass
public static void setUpClass() {
    new MockCouchbase();
}

@Test
public void testPost() throws Exception {
    GraphNode node = new GraphNode(GraphNodeType.DOMAIN, "alon.com");
    graph.post(node);
    GraphNode retNode = graph.getSingleNode(node.getValue(), node.getType());
    assertEquals(node.getValue(), retNode.getValue());
    assertEquals(node.getType(), retNode.getType());    
}
}

這是我的課程正在測試:

public class GraphConnectorImpl implements IGraphConnector {

private static ICouchConnector couch = new CouchConnectorImpl();  // <-- Basic implementation which I don't want the test to execute

@Override
public void post(GraphNode node) {
    CouchEntry entry = new CouchEntry(node.getValue(), JsonDocument.create(node.getValue()));
    couch.put(entry);
}

@Override
public GraphNode getSingleNode(String nodeName, GraphNodeType nodeType) {
    return new GraphNode(nodeType, couch.get(nodeName).getKey());
}
}

由於某種原因,我在測試類中創建的類MockCouchbase不會自動綁定到測試類的專用字段ICouchConnector couch ,如本教程所示。 而是調用了真正的實現,這顯然是不可取的。
如果刪除對實際實現的引用,我將得到一個很好的NullPointerException
我嘗試使用@Tested@Injectable批注,但無濟於事。

解決我自己的問題。

我編寫被測類的方式的問題是顯式調用實際實現的構造函數。 如果任何模擬框架都可以“繞過”它,我會感到驚訝。

相反,我應該創建一個構造函數,將ICouchConnector作為其參數之一,例如,正確使用依賴項注入。

public class GraphConnectorImpl implements IGraphConnector {
    private static ICouchConnector couch;

    public GraphConnectorImpl(ICouchConnector connector) {
        couch = connector;
    }
    // Rest of class...
}

然后,JMockit將嘗試查找與測試類中帶注釋的@Tested@Injectable字段相對應的構造函數。

public class GraphConnectorTest {
    @Tested
    GraphConnectorImpl graph;

    @Injectable
    ICouchConnector couch;

    // Rest of class...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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