JMockit を使用して動作テストを実行しようとしています。テストの 1 つで、最終オブジェクトでメソッドを呼び出す必要があります。ただし、最終オブジェクトは初期化されておらず (null オブジェクト)、テストで初期化する方法がわかりません (最終的に定義されているため)。クラスで最終インスタンスをモックするソリューションが見つかりません。最初にテストを見て、コードを説明します。
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 を取得できないことです。テスト結果には、「呼び出しがありません」と表示されます。(Eclipse で) デバッグ モードでチェックしたところ、nc.nrh は常に null です。
さらに情報が必要な場合はお知らせください。ご協力いただきありがとうございます。