package org.mockitousage.stubbing; import org.junit.Test; import java.util.ArrayList; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.*; public class StubbingReturnsSelfTest { @Test public void should_stub_builder_method() { Builder builder = mock(Builder.class, RETURNS_SELF); assertThat(builder.returnSelf()).isEqualTo(builder); } @Test public void should_return_default_return_when_not_a_builder() { Builder builder = mock(Builder.class, RETURNS_SELF); assertThat(builder.returnString()).isEqualTo(null); } @Test public void should_return_self_when_call_on_method_in_superclass() { BuilderSubClass builder = mock(BuilderSubClass.class, RETURNS_SELF); assertThat(builder.returnSelf()).isEqualTo(builder); } @Test public void should_return_self_when_call_on_method_in_subclass() { BuilderSubClass builder = mock(BuilderSubClass.class, RETURNS_SELF); assertThat(builder.returnsSubClass()).isEqualTo(builder); } @Test public void should_return_self_when_call_on_method_in_subclass_returns_superclass() { BuilderSubClass builder = mock(BuilderSubClass.class, RETURNS_SELF); assertThat(builder.returnSuperClass()).isEqualTo(builder); } @Test public void should_return_stubbed_answer_when_call_on_method_returns_self() { Builder builder = mock(Builder.class, RETURNS_SELF); Builder anotherBuilder = mock(Builder.class, RETURNS_SELF); when(builder.returnSelf()).thenReturn(anotherBuilder); assertThat(builder.returnSelf().returnSelf()).isEqualTo(anotherBuilder); } @Test public void should_not_fail_when_calling_void_returning_method() { Builder builder = mock(Builder.class, RETURNS_SELF); builder.returnNothing(); } @Test public void should_not_fail_when_calling_primitive_returning_method() { Builder builder = mock(Builder.class, RETURNS_SELF); assertThat(builder.returnInt()).isEqualTo(0); } @Test public void use_full_builder_with_terminating_method() { HttpBuilder builder = mock(HttpBuilder.class, RETURNS_SELF); HttpRequesterWithHeaders requester = new HttpRequesterWithHeaders(builder); String response = "StatusCode: 200"; when(builder.request()).thenReturn(response); assertThat(requester.request("URI")).isEqualTo(response); } private static class Builder { public Builder returnSelf() { return this; } public String returnString() { return "Self"; } public void returnNothing() {} public int returnInt() { return 1; } } private static class BuilderSubClass extends Builder { public BuilderSubClass returnsSubClass() { return this; } public Builder returnSuperClass() { return this; } } private static class HttpRequesterWithHeaders { private HttpBuilder builder; public HttpRequesterWithHeaders(HttpBuilder builder) { this.builder = builder; } public String request(String uri) { return builder.withUrl(uri) .withHeader("Content-type: application/json") .withHeader("Authorization: Bearer") .request(); } } private static class HttpBuilder { private String uri; private List<String> headers; public HttpBuilder() { this.headers = new ArrayList<String>(); } public HttpBuilder withUrl(String uri) { this.uri = uri; return this; } public HttpBuilder withHeader(String header) { this.headers.add(header); return this; } public String request() { return uri + headers.toString(); } } }