BAEL-3416 - Mockito and Fluent APIs

This commit is contained in:
Jonathan Cook 2019-11-17 11:59:47 +01:00
parent ad17d70bbb
commit 905097c637
4 changed files with 96 additions and 104 deletions

View File

@ -53,13 +53,17 @@ public class Pizza {
private String name; private String name;
private PizzaSize size; private PizzaSize size;
private List<String> toppings = new ArrayList<>(); private List<String> toppings;
private boolean stuffedCrust; private boolean stuffedCrust;
private boolean collect; private boolean collect;
private Integer discount = null; private Integer discount = null;
public PizzaBuilder(String name) { public PizzaBuilder() {
}
public PizzaBuilder name(String name) {
this.name = name; this.name = name;
return this;
} }
public PizzaBuilder size(PizzaSize size) { public PizzaBuilder size(PizzaSize size) {
@ -67,7 +71,10 @@ public class Pizza {
return this; return this;
} }
public PizzaBuilder withExtaTopping(String extraTopping) { public PizzaBuilder withExtraTopping(String extraTopping) {
if (this.toppings == null) {
toppings = new ArrayList<>();
}
this.toppings.add(extraTopping); this.toppings.add(extraTopping);
return this; return this;
} }

View File

@ -1,29 +1,23 @@
package com.baeldung.mockito.fluentapi; package com.baeldung.mockito.fluentapi;
import java.util.List;
import java.util.Optional;
import com.baeldung.mockito.fluentapi.Pizza.PizzaSize; import com.baeldung.mockito.fluentapi.Pizza.PizzaSize;
public class PizzaService { public class PizzaService {
private Pizza pizza; private Pizza.PizzaBuilder builder;
public PizzaService(Pizza.PizzaBuilder builder) { public PizzaService(Pizza.PizzaBuilder builder) {
this.pizza = builder.build(); this.builder = builder;
} }
public List<String> listToppings(Pizza.PizzaBuilder builder) { public Pizza orderHouseSpecial() {
Pizza build = builder.size(PizzaSize.LARGE) return builder.name("Special")
.withExtaTopping("Mushroom") .size(PizzaSize.LARGE)
.withStuffedCrust(false) .withExtraTopping("Mushrooms")
.withStuffedCrust(true)
.withExtraTopping("Chilli")
.willCollect(true) .willCollect(true)
.applyDiscount(20) .applyDiscount(20)
.build(); .build();
} }
public boolean isLarge() {
return PizzaSize.LARGE.equals(pizza.getSize());
}
} }

View File

@ -1,86 +1,88 @@
package com.baeldung.mockito.fluentapi; package com.baeldung.mockito.fluentapi;
import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.junit.Assert;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.mockito.Answers; import org.mockito.Answers;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.Mockito; import org.mockito.Mockito;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
import static org.mockito.Mockito.when; import com.baeldung.mockito.fluentapi.Pizza.PizzaBuilder;
import com.baeldung.mockito.fluentapi.Pizza.PizzaSize; import com.baeldung.mockito.fluentapi.Pizza.PizzaSize;
public class PizzaServiceUnitTest { public class PizzaServiceUnitTest {
@Mock
private Pizza expectedPizza;
@Mock(answer = Answers.RETURNS_DEEP_STUBS) @Mock(answer = Answers.RETURNS_DEEP_STUBS)
private ArrayList<String> mockList; private PizzaBuilder anotherbuilder;
@Captor
private ArgumentCaptor<String> stringCaptor;
@Captor
private ArgumentCaptor<Pizza.PizzaSize> sizeCaptor;
@Before @Before
public void setup() { public void setup() {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
} }
@Test
public void givenPizzaWithToppings_whenServiceInvoked_thenReturnsList() {
//Foo mock = mock(Foo.class, RETURNS_DEEP_STUBS); @Test
public void givenTraditonalMocking_whenServiceInvoked_thenPizzaIsBuilt() {
List<String> bob = Arrays.asList("a1", "a2", "b1", "c2", "c1"); PizzaBuilder nameBuilder = Mockito.mock(Pizza.PizzaBuilder.class);
PizzaBuilder sizeBuilder = Mockito.mock(Pizza.PizzaBuilder.class);
PizzaBuilder firstToppingBuilder = Mockito.mock(Pizza.PizzaBuilder.class);
when(mockList.stream() PizzaBuilder secondToppingBuilder = Mockito.mock(Pizza.PizzaBuilder.class);
.filter(s -> s.startsWith("c")) PizzaBuilder stuffedBuilder = Mockito.mock(Pizza.PizzaBuilder.class);
.map(String::toUpperCase) PizzaBuilder willCollectBuilder = Mockito.mock(Pizza.PizzaBuilder.class);
.sorted() PizzaBuilder discountBuilder = Mockito.mock(Pizza.PizzaBuilder.class);
.collect(Collectors.toList()))
.thenReturn(bob); PizzaBuilder builder = Mockito.mock(Pizza.PizzaBuilder.class);
when(builder.name(anyString())).thenReturn(nameBuilder);
Assert.assertEquals(bob, mockList.stream() when(nameBuilder.size(any(Pizza.PizzaSize.class))).thenReturn(sizeBuilder);
.filter(s -> s.startsWith("c")) when(sizeBuilder.withExtraTopping(anyString())).thenReturn(firstToppingBuilder);
.map(String::toUpperCase) when(firstToppingBuilder.withStuffedCrust(anyBoolean())).thenReturn(stuffedBuilder);
.sorted() when(stuffedBuilder.withExtraTopping(anyString())).thenReturn(secondToppingBuilder);
.collect(Collectors.toList())); when(secondToppingBuilder.willCollect(anyBoolean())).thenReturn(willCollectBuilder);
when(willCollectBuilder.applyDiscount(anyInt())).thenReturn(discountBuilder);
when(discountBuilder.build()).thenReturn(expectedPizza);
// List<String> filtered = Arrays.asList("a1", "a2", "b1", "c2", "c1")
// .stream() PizzaService service = new PizzaService(builder);
// .filter(s -> s.startsWith("c")) assertEquals("Expected Pizza", expectedPizza, service.orderHouseSpecial());
// .map(String::toUpperCase)
// .sorted() verify(builder).name(stringCaptor.capture());
// .collect(Collectors.toList()); assertEquals("Pizza name: ", "Special", stringCaptor.getValue());
//
// verify(nameBuilder).size(sizeCaptor.capture());
// assertEquals("Pizza size: ", PizzaSize.LARGE, sizeCaptor.getValue());
//
// Pizza.PizzaBuilder builder = Mockito.mock(Pizza.PizzaBuilder.class, Mockito.RETURNS_DEEP_STUBS); }
//
// Pizza pizza = Mockito.mock(Pizza.class); @Test
// public void givenDeepStubs_whenServiceInvoked_thenPizzaIsBuilt() {
// Mockito.when(builder Mockito.when(anotherbuilder.name(anyString())
// .size(PizzaSize.LARGE) .size(any(Pizza.PizzaSize.class))
// .withExtaTopping("Mushroom") .withExtraTopping(anyString())
// .withStuffedCrust(false) .withStuffedCrust(anyBoolean())
// .willCollect(true) .withExtraTopping(anyString())
// .applyDiscount(20) .willCollect(anyBoolean())
// .build()).thenReturn(pizza); .applyDiscount(anyInt())
// .build())
// PizzaService service = new PizzaService(builder); .thenReturn(expectedPizza);
//
// List<String> listToppings = service.listToppings(); PizzaService service = new PizzaService(anotherbuilder);
assertEquals("Expected Pizza", expectedPizza, service.orderHouseSpecial());
} }
} }

View File

@ -1,6 +1,8 @@
package com.baeldung.mockito.fluentapi; package com.baeldung.mockito.fluentapi;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import org.junit.Test; import org.junit.Test;
@ -9,35 +11,22 @@ import com.baeldung.mockito.fluentapi.Pizza.PizzaSize;
public class PizzaUnitTest { public class PizzaUnitTest {
@Test @Test
public void givenPizza_whenBuilt_thenShouldReturnPizzaWithCorrectAttributes() { public void givenFluentPizzaApi_whenBuilt_thenPizzaHasCorrectAttributes() {
Pizza pizza = new Pizza Pizza pizza = new Pizza.PizzaBuilder()
.PizzaBuilder("Margherita") .name("Margherita")
.size(PizzaSize.LARGE) .size(PizzaSize.LARGE)
.withExtaTopping("Mushroom") .withExtraTopping("Mushroom")
.withStuffedCrust(false) .withStuffedCrust(false)
.willCollect(true) .willCollect(true)
.applyDiscount(20) .applyDiscount(20)
.build(); .build();
//assert assertEquals("Pizza name: ", "Margherita", pizza.getName());
assertEquals("Pizza size: ", PizzaSize.LARGE, pizza.getSize());
assertEquals("Extra toppings: ", "Mushroom", pizza.getToppings()
.get(0));
assertFalse("Has stuffed crust: ", pizza.isStuffedCrust());
assertTrue("Will collect: ", pizza.isCollecting());
assertEquals("Discounts: ", Integer.valueOf(20), pizza.getDiscount());
} }
@Test
public void givenPizza_whenBuiltWithTraditonalMock_thenShouldReturnPizza() {
Mock
Pizza pizza = new Pizza
.PizzaBuilder("Margherita")
.size(PizzaSize.LARGE)
.withExtaTopping("Mushroom")
.withStuffedCrust(false)
.willCollect(true)
.applyDiscount(20)
.build();
//assert
}
} }