diff --git a/src/test/java/org/takes/http/BkBasicTest.java b/src/test/java/org/takes/http/BkBasicTest.java index 11a265035..0a9400f75 100644 --- a/src/test/java/org/takes/http/BkBasicTest.java +++ b/src/test/java/org/takes/http/BkBasicTest.java @@ -32,7 +32,6 @@ import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; -import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import java.net.URI; @@ -41,7 +40,6 @@ import org.hamcrest.Matchers; import org.junit.Ignore; import org.junit.Test; -import org.mockito.Mockito; import org.takes.Request; import org.takes.Response; import org.takes.Take; @@ -64,8 +62,6 @@ * persistent connections. Would be great to implement * this feature. BkBasic.accept should handle more * than one HTTP request in one connection. - * @todo #516:30min It will be nice to refactor tests with Socket usage and - * replace them to real statements. See usage of BkBasicTest.createMockSocket. * @todo #516:15min Move header names from BkBasic to public constants. * Reusable header names will help in many situations. For example - in new * integration tests. @@ -98,9 +94,8 @@ public final class BkBasicTest { */ @Test public void handlesSocket() throws IOException { - final Socket socket = createMockSocket(); - final ByteArrayOutputStream baos = new ByteArrayOutputStream(); - Mockito.when(socket.getOutputStream()).thenReturn(baos); + final MkSocket socket = BkBasicTest.createMockSocket(); + final ByteArrayOutputStream baos = socket.bufferedOutput(); new BkBasic(new TkText("Hello world!")).accept(socket); MatcherAssert.assertThat( baos.toString(), @@ -370,9 +365,8 @@ public void run() { * @return Prepared Socket mock * @throws IOException If some problem inside */ - private static Socket createMockSocket() throws IOException { - final Socket socket = Mockito.mock(Socket.class); - Mockito.when(socket.getInputStream()).thenReturn( + private static MkSocket createMockSocket() throws IOException { + return new MkSocket( new ByteArrayInputStream( Joiner.on(BkBasicTest.CRLF).join( "GET / HTTP/1.1", @@ -383,16 +377,5 @@ private static Socket createMockSocket() throws IOException { ).getBytes() ) ); - Mockito.when(socket.getLocalAddress()).thenReturn( - InetAddress.getLocalHost() - ); - Mockito.when(socket.getLocalPort()).thenReturn(0); - Mockito.when(socket.getInetAddress()).thenReturn( - InetAddress.getLocalHost() - ); - Mockito.when(socket.getPort()).thenReturn(0); - final ByteArrayOutputStream baos = new ByteArrayOutputStream(); - Mockito.when(socket.getOutputStream()).thenReturn(baos); - return socket; } } diff --git a/src/test/java/org/takes/http/MkSocket.java b/src/test/java/org/takes/http/MkSocket.java new file mode 100644 index 000000000..650cdac89 --- /dev/null +++ b/src/test/java/org/takes/http/MkSocket.java @@ -0,0 +1,105 @@ +/** + * The MIT License (MIT) + * + * Copyright (c) 2015 Yegor Bugayenko + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package org.takes.http; + +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.InetAddress; +import java.net.Socket; + +/** + * Socket mock for reuse. + * + * @author Nicolas Filotto (nicolas.filotto@gmail.com) + * @version $Id$ + * @since 0.32 + */ +public final class MkSocket extends Socket { + + /** + * The address to provide for testing purpose. + */ + private final transient InetAddress address; + + /** + * The output stream of the socket. + */ + private final transient ByteArrayOutputStream output; + + /** + * The input stream of the socket. + */ + private final transient InputStream input; + + /** + * Constructs a {@code MkSocket} with the specified input stream. + * @param input The input stream of the socket. + */ + public MkSocket(final InputStream input) { + super(); + this.address = InetAddress.getLoopbackAddress(); + this.output = new ByteArrayOutputStream(); + this.input = input; + } + + @Override + public InputStream getInputStream() { + return this.input; + } + + @Override + public OutputStream getOutputStream() { + return this.output; + } + + @Override + public InetAddress getInetAddress() { + return this.address; + } + + @Override + public InetAddress getLocalAddress() { + return this.address; + } + + @Override + public int getPort() { + return 0; + } + + @Override + public int getLocalPort() { + return 0; + } + + /** + * Gives the output stream in {@link ByteArrayOutputStream} to be + * able to test it. + * @return The output in {@link ByteArrayOutputStream}. + */ + public ByteArrayOutputStream bufferedOutput() { + return this.output; + } +}