我正在尝试使用 JMockit 进行行为测试。在其中一个测试中,我需要调用最终对象中的方法。但是,最终对象未初始化(空对象),我不知道如何在测试中初始化它(因为它被定义为最终对象)。我找不到在类中模拟最终实例的解决方案。先看测试,我再解释一下代码。
public class NetworkClientTest {
@Cascading @Capturing ServerRequestHandler nrh;
@Test
public void testRequestSimilar(){
//define test parameters
String smiles = "abcd";
float t = (float) 0.1;
final Map<String, Object> parameters = new HashMap<String, Object>();
String smi = StringEscapeUtils.unescapeJava(smiles);
parameters.put("smiles",smi );
parameters.put("tanimoto", t);
//end define test parameters
//try to initialize NetworkClient object
new MockUp<NetworkClient>() {
@Mock
public void $init(){
}
};
NetworkClient nc = new NetworkClient();
new Expectations(){
//ServerRequestHandler nrh;
{
nrh.sendRequest("get_similar_entries", parameters);
}
};
//when nc.requestSimilarEntries is called, nc.nrh.sendRequest will be expected.
nc.requestSimilarEntries(smiles, t);
}
其中nrh是nc(NetworkClient类)中定义的最终实例,并且在调用nc.requestSimilarEntries之后将调用nc.nrh.sendRequest。
public class NetworkClient {
private final ServerRequestHandler nrh = new ServerRequestHandler();
...
public void requestSimilarEntries(String smiles, float tanimoto) {
// Set up parameters
Map<String, Object> parameters = new HashMap<String, Object>();
String smi = StringEscapeUtils.unescapeJava(smiles);
parameters.put("smiles",smi );
parameters.put("tanimoto", tanimoto);
// Send a request to the handler
nrh.sendRequest("get_similar_entries", parameters);
}
问题是我无法在测试中初始化最终的 ServerRequestHandler nrh。测试结果显示“缺少调用”。我检查了 Debug模式(在 Eclipse 中),并且 nc.nrh 始终为 null。
如果您需要更多信息,请告诉我,感谢您的帮助!
最佳答案
您正在模拟 NetworkClient
的构造函数,这也意味着实例变量未实例化。您需要实例化 nrh
变量。例如:
new MockUp<NetworkClient>() {
@Mock
public void $init(Invocation inv){
NetworkClient client = inv.getInvokedInstance();
Deencapsulation.setField(client, "nrh", new ServerRequestHandler());
}
};
现在您可能还想模拟 ServerRequestHandler
类,在这种情况下,您可以简单地创建一个新的 MockUp
:
new MockUp<NetworkClient>() {
};
new MockUp<ServerRequestHandler>() {
};
注意:我已经有一段时间没有使用 jmockit 了,所以它可能不起作用,但可能值得尝试。
关于java - 如何使用 JMockit 模拟类中的最终实例变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17349105/