blob: d6b1f189745b8d0a53631ab5f5cb2a1d9777203e [file] [log] [blame]
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();
}
}
}