JMockit - 无法将模拟 class 绑定到测试 class
JMockit - Can't bind mocked class to tested class
我有一个 3 层的应用程序:
应用 <--> 图表 <--> Couchbase
我正在尝试通过模拟 couchbase 层来测试 GraphConnector,"replacing" 它使用非常基本的内存中图形实现,使用 JMockit tutorial 中演示的相同方法。
这是我的测试class(请原谅我的缩进,还没有掌握它的窍门):
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());
}
}
这是我正在测试的 class:
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());
}
}
出于某种原因,我在测试 class 中创建的 class MockCouchbase
不会自动绑定到测试 [=] 的私有字段 ICouchConnector couch
33=],如教程所示。而是调用了真正的实现,这显然是不可取的。
如果我删除对实际实现的引用,我只会得到一个很好的 ol' NullPointerException
.
我尝试使用 @Tested
和 @Injectable
注释但无济于事。
解决我自己的问题。
我编写被测 class 的方式的问题是显式调用实际实现的构造函数。如果有任何模拟框架可以做到这一点,我会感到惊讶 "bypass"。
相反,我应该创建一个将 ICouchConnector
作为其参数之一的构造函数,例如正确使用依赖注入。
public class GraphConnectorImpl implements IGraphConnector {
private static ICouchConnector couch;
public GraphConnectorImpl(ICouchConnector connector) {
couch = connector;
}
// Rest of class...
}
JMockit 然后将尝试在测试 class.
中找到对应于注释 @Tested
和 @Injectable
字段的构造函数
public class GraphConnectorTest {
@Tested
GraphConnectorImpl graph;
@Injectable
ICouchConnector couch;
// Rest of class...
}
我有一个 3 层的应用程序: 应用 <--> 图表 <--> Couchbase
我正在尝试通过模拟 couchbase 层来测试 GraphConnector,"replacing" 它使用非常基本的内存中图形实现,使用 JMockit tutorial 中演示的相同方法。
这是我的测试class(请原谅我的缩进,还没有掌握它的窍门):
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());
}
}
这是我正在测试的 class:
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());
}
}
出于某种原因,我在测试 class 中创建的 class MockCouchbase
不会自动绑定到测试 [=] 的私有字段 ICouchConnector couch
33=],如教程所示。而是调用了真正的实现,这显然是不可取的。
如果我删除对实际实现的引用,我只会得到一个很好的 ol' NullPointerException
.
我尝试使用 @Tested
和 @Injectable
注释但无济于事。
解决我自己的问题。
我编写被测 class 的方式的问题是显式调用实际实现的构造函数。如果有任何模拟框架可以做到这一点,我会感到惊讶 "bypass"。
相反,我应该创建一个将 ICouchConnector
作为其参数之一的构造函数,例如正确使用依赖注入。
public class GraphConnectorImpl implements IGraphConnector {
private static ICouchConnector couch;
public GraphConnectorImpl(ICouchConnector connector) {
couch = connector;
}
// Rest of class...
}
JMockit 然后将尝试在测试 class.
中找到对应于注释@Tested
和 @Injectable
字段的构造函数
public class GraphConnectorTest {
@Tested
GraphConnectorImpl graph;
@Injectable
ICouchConnector couch;
// Rest of class...
}