0

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 です。

さらに情報が必要な場合はお知らせください。ご協力いただきありがとうございます。

4

1 に答える 1