我想用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',因爲它不需要。一般來說,你不要模擬正在測試的類。 –