BAEL-3416 - Mockito and Fluent APIs
This commit is contained in:
parent
ad17d70bbb
commit
905097c637
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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());
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user