2013-06-27 3 views
0

JMockit을 사용하여 동작 테스트를 수행하려고합니다. 테스트 중 하나에서 최종 객체에서 메소드를 호출해야합니다. 그러나 최종 개체가 초기화되지 않은 (null 개체) 및 테스트에서 초기화하는 방법을 모릅니다 (최종 정의 된 이후). 클래스에서 최종 인스턴스를 조롱하는 솔루션을 찾을 수 없습니다. 먼저 테스트를보고 코드를 설명 할 것입니다. nc.requestSimilarEntries 호출 한 후에 NRH은 NC (NetworkClient 클래스)와 nc.nrh.sendRequest 정의 마지막 인스턴스이다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); 
} 

가 호출된다.

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를 가져올 수 없다는 것입니다. 테스트 결과에 '누락 된 호출'이 표시됩니다. 나는 디버그 모드 (이클립스에서)에서 체크하고 nc.nrh는 항상 null이다.

자세한 정보가 필요하면 알려주세요. 도움을 주셔서 감사합니다.

답변

2

NetworkClient의 생성자를 조롱하고 있습니다. 이는 인스턴스 변수가 인스턴스화되지 않았다는 것을 의미합니다. nrh 변수를 인스턴스화해야합니다. 예를 들어 :

new MockUp<NetworkClient>() { 
    }; 

    new MockUp<ServerRequestHandler>() { 
    }; 

참고 :

new MockUp<NetworkClient>() { 
    @Mock 
    public void $init(Invocation inv){ 
     NetworkClient client = inv.getInvokedInstance(); 
     Deencapsulation.setField(client, "nrh", new ServerRequestHandler()); 
    } 
    }; 

지금 당신은 아마 또한 단순히 새로운 MockUp을 만들 수있는 경우에 ServerRequestHandler 클래스를 조롱하려는 내가 한 동안 jmockit을 사용하지 않은 그래서 그것은 작동하지 않을 수도 있지만 아마도 시도 가치가 있습니다.

+0

예, 감사합니다. 이것은 문제를 완벽하게 해결했습니다. – jgmao

+3

'MockUp '는 필요하지 않으므로 간단히 제거하십시오. 일반적으로 테스트중인 클래스는 모의하지 않습니다. –