2015-02-04 2 views
0

У меня есть следующий метод в моем TcpTransport класс:Невозможно проверить записанное значение в выходном потоке издевались

public synchronized void send(Envelope envelope) throws IOException { 
    ensureSocketOpen(); 
    String envelopeString = envelopeSerializer.serialize(envelope); 

    if (traceWriter != null && 
      traceWriter.isEnabled()) { 
     traceWriter.trace(envelopeString, TraceWriter.DataOperation.SEND); 
    } 

    try { 
     byte[] envelopeBytes = envelopeString.getBytes("UTF-8"); 
     outputStream.write(envelopeBytes); 
     outputStream.flush(); 
    } catch (UnsupportedEncodingException e) { 
     throw new IllegalArgumentException("Could not convert the serialized envelope to a UTF-8 byte array", e); 
    } 
} 

и испытание для него:

// Arrange 
TcpTransport target = getAndOpenTarget(); // gets a valid instance 
Envelope envelope = mock(Envelope.class); 
String serializedEnvelope = DataUtil.createRandomString(200); 
when(envelopeSerializer.serialize(envelope)).thenReturn(serializedEnvelope); 

// Act 
target.send(envelope); 

// Assert 
verify(outputStream, times(1)).write(AdditionalMatchers.aryEq(serializedEnvelope.getBytes("UTF-8"))); 
verify(outputStream, atLeastOnce()).flush(); 

Экземпляр OutputStream был создается следующим образом:

outputStream = mock(OutputStream.class); 

Я использую sam e для преобразования строки (это тот же самый экземпляр, так как посмеянный конвертSerializer класс возвращает его) в массив байтов UTF-8. Но я получаю следующее сообщение об ошибке:

Argument(s) are different! Wanted: 
outputStream.write(
    [102, 100, 104, 54, 111, 104, 55, 99, 51, 101, 120, 119, 99, 114, 50,  120, 104, 98, 98, 51, 99, 48, 120, 106, 55, 114, 102, 114, 102, 103, 50, 111, 108, 122, 109, 119, 117, 100, 50, 102, 114, 112, 51, 109, 114, 121, 49, 114, 104, 104, 103, 101, 104, 112, 54, 48, 54, 122, 98, 101, 113, 100, 54, 116, 51, 102, 106, 56, 118, 99, 102, 52, 98, 98, 105, 114, 111, 112, 111, 52, 102, 56, 97, 107, 51, 98, 107, 105, 119, 49, 117, 97, 98, 99, 48, 55, 53, 121, 102, 101, 50, 105, 117, 110, 115, 112, 112, 102, 53, 100, 54, 120, 117, 115, 117, 105, 99, 105, 109, 111, 100, 111, 122, 101, 57, 116, 102, 110, 55, 114, 52, 97, 114, 55, 48, 49, 113, 51, 97, 116, 57, 115, 110, 112, 55, 52, 106, 111, 101, 121, 112, 54, 100, 112, 111, 56, 102, 52, 115, 51, 99, 98, 99, 98, 102, 118, 107, 57, 99, 48, 98, 114, 111, 111, 115, 111, 120, 119, 106, 101, 103, 102, 99, 116, 98, 98, 114, 109, 110, 116, 113, 97, 53, 120, 52, 113, 111, 114, 118, 110] 
); 
-> at  org.limeprotocol.network.tcp.TcpTransportTest.send_validArgumentsAndOpenStreamAndTraceEnabled_callsWriteAndTraces(TcpTransportTest.java:98) 
Actual invocation has different arguments: 
outputStream.write(
    [102, 100, 104, 54, 111, 104, 55, 99, 51, 101, 120, 119, 99, 114, 50, 120, 104, 98, 98, 51, 99, 48, 120, 106, 55, 114, 102, 114, 102, 103, 50, 111, 108, 122, 109, 119, 117, 100, 50, 102, 114, 112, 51, 109, 114, 121, 49, 114, 104, 104, 103, 101, 104, 112, 54, 48, 54, 122, 98, 101, 113, 100, 54, 116, 51, 102, 106, 56, 118, 99, 102, 52, 98, 98, 105, 114, 111, 112, 111, 52, 102, 56, 97, 107, 51, 98, 107, 105, 119, 49, 117, 97, 98, 99, 48, 55, 53, 121, 102, 101, 50, 105, 117, 110, 115, 112, 112, 102, 53, 100, 54, 120, 117, 115, 117, 105, 99, 105, 109, 111, 100, 111, 122, 101, 57, 116, 102, 110, 55, 114, 52, 97, 114, 55, 48, 49, 113, 51, 97, 116, 57, 115, 110, 112, 55, 52, 106, 111, 101, 121, 112, 54, 100, 112, 111, 56, 102, 52, 115, 51, 99, 98, 99, 98, 102, 118, 107, 57, 99, 48, 98, 114, 111, 111, 115, 111, 120, 119, 106, 101, 103, 102, 99, 116, 98, 98, 114, 109, 110, 116, 113, 97, 53, 120, 52, 113, 111, 114, 118, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
(+ a lot of zeros) 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
0, 
200 
); 

Похоже, что проверить способ издевались OutputStream например, проверяет значение параметра против внутреннего буфера, с длиной 8192 пунктов. Сгенерированный класс для mocked OutputStream: OutputStream $$ EnhancerByMockitoWithCGLIB $$ b1c65902.

Любые идеи, как я могу проверить, был ли вызван метод записи с правильным значением с помощью Mockito?

+0

Я не понимаю, что это правильное значение? Если вы ожидаете какой-либо массив байтов, начинающийся с 102, 100, ... тогда пользовательский макет - это путь. Также обратите внимание, что 'ByteArrayOutputStream' может помочь и избежать макета здесь. –

+0

Да, я мог бы использовать ByteArrayOutputStream, но нет способа сделать это с Mockito без использования пользовательского совпадения? –

+0

Я боюсь, что здесь нет никакой магии, либо пользовательский «начинать с», или «проверять» размер 8192 –

ответ

5

Вместо того, чтобы издеваться над OutputStream, проще его обеспечить. особенно для текста.

outputStream = new ByteArrayOutputStream(); 
outputStream.write("Hello World".getBytes()); 

assertEquals("Hello World", outputStream.toString()); 

Если вы хотите, чтобы проверить флеша() вы могли бы сделать

boolean[] flushed = { false }; 
outputStream = new ByteArrayOutputStream() { 
    public void flush() throws IOException { 
     super.flush(); 
     flushed[0] = true; 
    } 
}; 
Смежные вопросы