JMockit - 无法将mocked类绑定到测试类

时间:2015-10-20 12:03:49

标签: java unit-testing binding mocking jmockit

我有一个3层的应用程序: 应用< - >图表< - > Couchbase

我正在尝试通过模拟couchbase层来测试GraphConnector,并使用JMockit tutorial中演示的相同方法,用非常基本的内存中图形实现“替换”它。

这是我的测试课程(请原谅那个可怜的缩进,还没有得到它的支持):

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注释,但无济于事。

1 个答案:

答案 0 :(得分:0)

解决我自己的问题。

我在测试中编写类的方法的问题是显式调用实际实现的构造函数。如果任何模拟框架可以“绕过”它,我会感到惊讶。

相反,我应该创建一个构造函数,将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...
}