我想用JMockit来做行为测试。在其中一项测试中,我需要在最终对象中调用一个方法。然而,最终的对象没有初始化(空对象),我不知道如何在测试中初始化它(因为它是最终定义的)。我无法找到解决方案在课堂上嘲笑最终实例。先看看测试,我会解释代码。如何使用JMockit在类中模拟final实例变量
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.nrh.sendRequest限定的最终实例nc.requestSimilarEntries被称为后会被调用。
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。测试结果显示'缺少调用'。我检查了调试模式(在Eclipse中),并且nc.nrh始终为空。
请让我知道你是否需要更多信息,并感谢你的帮助!
是的,谢谢assylias!这完美地解决了这个问题。 – jgmao
只需移除'MockUp',因为它不需要。一般来说,你不要模拟正在测试的类。 –