2014-02-18 5 views
0

DatagramPacket을 생성자로 사용하는 클래스의 단위 테스트를 작성하려고합니다. 테스트 (첫 번째)와 테스트 할 클래스 (두 번째)를 아래에 모두 포함했습니다.최종 클래스 mock이 예상 값을 반환하지 않음

문제점은 내 when(). thenReturn 호출을 기반으로 예상 한 결과가 없다는 것입니다. 내 테스트에는 세 개의 print 문이있다. 첫 번째 코드 블록에서 test() 메서드의 맨 아래를 보라. 그것의 출력은

IP : 0.0.0.0, 포트 : 0, 데이터 :

내가 의도 한 출력은 다음과 같습니다

IP : 90.35.52.52, 포트 : 25200, 데이터 : 하트 비트^0a522

예상되는 출력을받지 못하는 이유를 알고있는 사람이 있습니까?

감사합니다.

UDPPacket_TEST.java

import static org.mockito.Mockito.*; 

import java.net.DatagramPacket; 
import java.net.InetAddress; 

import org.junit.Before; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.powermock.api.mockito.PowerMockito; 
import org.powermock.core.classloader.annotations.PrepareForTest; 
import org.powermock.modules.junit4.PowerMockRunner; 

@RunWith(PowerMockRunner.class) 
@PrepareForTest(DatagramPacket.class) 
public class UDPPacket_TEST { 

    DatagramPacket mDatagramPacket; 
    UDPPacket mPacket; 

    @Before 
    public void setup() { 
     PowerMockito.mockStatic(DatagramPacket.class); 
     mDatagramPacket = PowerMockito.mock(DatagramPacket.class); 
     InetAddress addRet = mock(InetAddress.class); 
     when(addRet.getHostAddress()).thenReturn("90.35.52.52"); 
     PowerMockito.when(mDatagramPacket.getPort()).thenReturn(25200); 
    } 

    @Test 
    public void test() { 
     byte[] packetData = "heartbeat^0a552".getBytes(); 
     PowerMockito.when(mDatagramPacket.getData()).thenReturn(packetData); 

     mPacket = new UDPPacket(mDatagramPacket); 

     System.out.println(String.format("IP: %s, Port: %d, Data: %s", mPacket.getIP(), mPacket.getPort(), mPacket.getData())); 
    } 

} 

UDPPacket.java는

public class UDPPacket { 

    String mIP; 
    int mPort; 
    String mData; 

    public UDPPacket(DatagramPacket receivedPacket) { 
     //Grab the information out 
     mData = new String(receivedPacket.getData()); 
     mIP = receivedPacket.getAddress().getHostAddress(); 
     mPort = receivedPacket.getPort(); 
    } 

    public String getIP() { 
     return mIP; 
    } 

    public int getPort() { 
     return mPort; 
    } 

    public String getData() { 
     return mData; 
    } 

} 

답변

0

나는 테스트를위한 접근 방식을 좋아하지 않는 것이 (하지만 난 ... 가끔 필요성을 이해). PowerMockito의 소스 코드를 살펴보면 "일반"인스턴스가 수신되는 DatagramPacket의 "모의"인스턴스가 전혀 생성되지 않는다는 것을 알 수 있습니다.

당신은 그러나 Whitebox를 사용하여 인스턴스의 필드를 설정할 수 있습니다

 Whitebox.setInternalState(mDatagramPacket, "buf", packetData); 

"고정"코드 ...

UDPPacket_TEST.java

@RunWith(PowerMockRunner.class) 
@PrepareForTest(DatagramPacket.class) 
public class UDPPacket_TEST { 

    DatagramPacket mDatagramPacket; 
    UDPPacket mPacket; 
    InetAddress addRet; 

    @Before 
    public void setup() { 
     mDatagramPacket = PowerMockito.mock(DatagramPacket.class); 
     addRet = mock(InetAddress.class); 
     when(addRet.getHostAddress()).thenReturn("90.35.52.52"); 
     PowerMockito.when(mDatagramPacket.getPort()).thenReturn(25200); 
    } 

    @Test 
    public void test() { 
     byte[] packetData = "heartbeat^0a552".getBytes(); 
     Whitebox.setInternalState(mDatagramPacket, "buf", packetData); 
     Whitebox.setInternalState(mDatagramPacket, "address", addRet); 
     Whitebox.setInternalState(mDatagramPacket, "port", 25200); 
     PowerMockito.when(mDatagramPacket.getData()).thenReturn(packetData); 

     mPacket = new UDPPacket(mDatagramPacket); 

     System.out.println(String.format("IP: %s, Port: %d, Data: %s", mPacket.getIP(), mPacket.getPort(), mPacket.getData())); 
    } 

} 

출력을 생성합니다 원하는 :

IP: 90.35.52.52, Port: 25200, Data: heartbeat^0a552 
+0

신난다, 작동한다! 나는 그 해명을 고맙게 생각한다, 피터. – Psygohn

관련 문제