package org.mockserver.junit; import org.junit.Before; import org.junit.Test; import org.junit.runner.Description; import org.junit.runners.model.Statement; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockserver.client.server.MockServerClient; import org.mockserver.integration.ClientAndServer; import org.mockserver.socket.PortFactory; import static org.hamcrest.Matchers.sameInstance; import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertThat; import static org.mockito.Mockito.*; import static org.mockito.MockitoAnnotations.initMocks; /** * @author jamesdbloom */ public class MockServerRuleTestWithMocks { @Mock private Statement mockStatement; @Mock private ClientAndServer mockClientAndServer; private MockServerClient mockServerClient; @Mock private MockServerRule.ClientAndServerFactory clientAndServerFactory; private int httpPort; @InjectMocks private MockServerRule mockServerRuleDynamicPorts; @InjectMocks private MockServerRule mockServerRuleSinglePort; @InjectMocks private MockServerRule mockServerRuleMultiplePorts; @InjectMocks private MockServerRule mockServerRulePerSuite; @InjectMocks private MockServerRule mockServerRulePerSuiteDuplicate; @Before public void setupFixture() { httpPort = PortFactory.findFreePort(); mockServerRuleDynamicPorts = new MockServerRule(this); mockServerRuleSinglePort = new MockServerRule(this, false, httpPort); mockServerRuleMultiplePorts = new MockServerRule(this, false, httpPort, httpPort + 1); mockServerRulePerSuite = new MockServerRule(this, true, httpPort); mockServerRulePerSuiteDuplicate = new MockServerRule(this, true, httpPort); initMocks(this); when(clientAndServerFactory.newClientAndServer()).thenReturn(mockClientAndServer); } @Test public void shouldStartAndStopMockServerWithDynamicPort() throws Throwable { // when mockServerRuleDynamicPorts.apply(mockStatement, Description.EMPTY).evaluate(); // then assertThat((ClientAndServer) mockServerClient, is(mockClientAndServer)); verify(mockStatement).evaluate(); verify(mockClientAndServer).stop(); } @Test public void shouldStartAndStopMockServerWithSinglePort() throws Throwable { // when mockServerRuleSinglePort.apply(mockStatement, Description.EMPTY).evaluate(); // then assertThat((ClientAndServer) mockServerClient, sameInstance(mockClientAndServer)); assertThat(mockServerRuleSinglePort.getPort(), is(httpPort)); assertThat(mockServerRuleSinglePort.getPorts(), is(new Integer[]{httpPort})); verify(mockStatement).evaluate(); verify(mockClientAndServer).stop(); } @Test public void shouldStartAndStopMockServerWithMultiplePorts() throws Throwable { // when mockServerRuleMultiplePorts.apply(mockStatement, Description.EMPTY).evaluate(); // then assertThat((ClientAndServer) mockServerClient, sameInstance(mockClientAndServer)); assertThat(mockServerRuleMultiplePorts.getPort(), is(httpPort)); assertThat(mockServerRuleMultiplePorts.getPorts(), is(new Integer[]{httpPort, httpPort + 1})); verify(mockStatement).evaluate(); verify(mockClientAndServer).stop(); } @Test public void shouldStartAndStopMockServerOncePerSuite() throws Throwable { // when mockServerRulePerSuite.apply(mockStatement, Description.EMPTY).evaluate(); // then assertThat((ClientAndServer) mockServerClient, is(mockClientAndServer)); assertThat(mockServerRulePerSuite.getPort(), is(httpPort)); assertThat(mockServerRulePerSuite.getPorts(), is(new Integer[]{httpPort})); verify(mockStatement).evaluate(); verify(clientAndServerFactory, times(1)).newClientAndServer(); verify(mockClientAndServer, times(0)).stop(); reset(mockStatement, clientAndServerFactory); // when mockServerRulePerSuiteDuplicate.apply(mockStatement, Description.EMPTY).evaluate(); // then assertThat((ClientAndServer) mockServerClient, is(mockClientAndServer)); assertThat(mockServerRulePerSuiteDuplicate.getPort(), is(httpPort)); assertThat(mockServerRulePerSuiteDuplicate.getPorts(), is(new Integer[]{httpPort})); verify(mockStatement).evaluate(); verify(clientAndServerFactory, times(0)).newClientAndServer(); verify(mockClientAndServer, times(0)).stop(); } }