Java JMockit-Can';t将模拟类绑定到测试类
我有一个具有3层的应用程序: 应用程序图形Couchbase 我试图通过模拟couchbase层并用一个非常基本的内存中图形实现“替换”它来测试GraphConnector,使用的方法与JMockit中演示的方法相同 这是我的测试课(请原谅,缩进不好,我还没掌握窍门):Java JMockit-Can';t将模拟类绑定到测试类,java,unit-testing,binding,mocking,jmockit,Java,Unit Testing,Binding,Mocking,Jmockit,我有一个具有3层的应用程序: 应用程序图形Couchbase 我试图通过模拟couchbase层并用一个非常基本的内存中图形实现“替换”它来测试GraphConnector,使用的方法与JMockit中演示的方法相同 这是我的测试课(请原谅,缩进不好,我还没掌握窍门): 公共类图形连接器测试{ 公共静态最终类MockCouchbase扩展了MockUp{ 私人地图沙发; @嘲弄 公开作废$clinit(){ coach=newhashmap(); } @嘲弄 公开作废认沽权(库切尼分录){ co
公共类图形连接器测试{
公共静态最终类MockCouchbase扩展了MockUp{
私人地图沙发;
@嘲弄
公开作废$clinit(){
coach=newhashmap();
}
@嘲弄
公开作废认沽权(库切尼分录){
coach.put(entry.getKey(),entry);
}
@嘲弄
公共CouchEntry get(字符串键){
返回沙发。获取(键);
}
}
GraphConnectorImpl graph=新的GraphConnectorImpl();
@课前
公共静态void setUpClass(){
新MockCouchbase();
}
@试验
public void testPost()引发异常{
GraphNode节点=新GraphNode(GraphNodeType.DOMAIN,“alon.com”);
图.post(节点);
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());
}
}
公共类GraphConnectorImpl实现IGraphConnector{
private static ICouchConnector coach=new CouchConnectorImpl();//解决我自己的问题
我编写被测类的方式存在的问题是显式地调用了实际实现的构造函数。如果任何模拟框架都能“绕过”这一点,我会感到惊讶
相反,我应该创建一个构造函数,将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...
}
JMockit教程中的这些示例测试在类上应用了MockUp
,而不是在接口上;这有很大的区别。但是,事实上,JMockit可以很好地模拟CouchConnectorImpl
类(测试中的代码保持不变),前提是测试使用MockUp
或@Mocked CouchConnectorImpl
。它确实可以很好地模拟具体的类,但是每当我调用getMockInstance()(为了在模拟的类上声明验证()),它就会禁用模拟的功能,并给我留下一个符合接口但不做任何事情的存根(实际上不调用任何方法)。在本例中,MockUp#getMockInstance()
没有任何用处;验证
是另一个API的一部分,与MockUp
无关。
public class GraphConnectorTest {
@Tested
GraphConnectorImpl graph;
@Injectable
ICouchConnector couch;
// Rest of class...
}