diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/fluentapi/Pizza.java b/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/fluentapi/Pizza.java index 28cbfacdc4..0a37a2cbbd 100644 --- a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/fluentapi/Pizza.java +++ b/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/fluentapi/Pizza.java @@ -53,13 +53,17 @@ public class Pizza { private String name; private PizzaSize size; - private List toppings = new ArrayList<>(); + private List toppings; private boolean stuffedCrust; private boolean collect; private Integer discount = null; - public PizzaBuilder(String name) { + public PizzaBuilder() { + } + + public PizzaBuilder name(String name) { this.name = name; + return this; } public PizzaBuilder size(PizzaSize size) { @@ -67,7 +71,10 @@ public class Pizza { return this; } - public PizzaBuilder withExtaTopping(String extraTopping) { + public PizzaBuilder withExtraTopping(String extraTopping) { + if (this.toppings == null) { + toppings = new ArrayList<>(); + } this.toppings.add(extraTopping); return this; } diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/fluentapi/PizzaService.java b/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/fluentapi/PizzaService.java index 6359ad8222..0f9d5c6b18 100644 --- a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/fluentapi/PizzaService.java +++ b/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/fluentapi/PizzaService.java @@ -1,29 +1,23 @@ package com.baeldung.mockito.fluentapi; -import java.util.List; -import java.util.Optional; - import com.baeldung.mockito.fluentapi.Pizza.PizzaSize; public class PizzaService { - private Pizza pizza; + private Pizza.PizzaBuilder builder; public PizzaService(Pizza.PizzaBuilder builder) { - this.pizza = builder.build(); + this.builder = builder; } - public List listToppings(Pizza.PizzaBuilder builder) { - Pizza build = builder.size(PizzaSize.LARGE) - .withExtaTopping("Mushroom") - .withStuffedCrust(false) + public Pizza orderHouseSpecial() { + return builder.name("Special") + .size(PizzaSize.LARGE) + .withExtraTopping("Mushrooms") + .withStuffedCrust(true) + .withExtraTopping("Chilli") .willCollect(true) .applyDiscount(20) .build(); } - - public boolean isLarge() { - return PizzaSize.LARGE.equals(pizza.getSize()); - } - } diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/fluentapi/PizzaServiceUnitTest.java b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/fluentapi/PizzaServiceUnitTest.java index 000c3b83ed..b5dd10b1d4 100644 --- a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/fluentapi/PizzaServiceUnitTest.java +++ b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/fluentapi/PizzaServiceUnitTest.java @@ -1,86 +1,88 @@ package com.baeldung.mockito.fluentapi; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertEquals; +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.Test; import org.mockito.Answers; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; -import static org.mockito.Mockito.when; - +import com.baeldung.mockito.fluentapi.Pizza.PizzaBuilder; import com.baeldung.mockito.fluentapi.Pizza.PizzaSize; public class PizzaServiceUnitTest { + @Mock + private Pizza expectedPizza; + @Mock(answer = Answers.RETURNS_DEEP_STUBS) - private ArrayList mockList; + private PizzaBuilder anotherbuilder; + + @Captor + private ArgumentCaptor stringCaptor; + @Captor + private ArgumentCaptor sizeCaptor; @Before public void setup() { MockitoAnnotations.initMocks(this); } - - - @Test - public void givenPizzaWithToppings_whenServiceInvoked_thenReturnsList() { - //Foo mock = mock(Foo.class, RETURNS_DEEP_STUBS); - - List bob = Arrays.asList("a1", "a2", "b1", "c2", "c1"); - - - when(mockList.stream() - .filter(s -> s.startsWith("c")) - .map(String::toUpperCase) - .sorted() - .collect(Collectors.toList())) - .thenReturn(bob); - - Assert.assertEquals(bob, mockList.stream() - .filter(s -> s.startsWith("c")) - .map(String::toUpperCase) - .sorted() - .collect(Collectors.toList())); - - -// List filtered = Arrays.asList("a1", "a2", "b1", "c2", "c1") -// .stream() -// .filter(s -> s.startsWith("c")) -// .map(String::toUpperCase) -// .sorted() -// .collect(Collectors.toList()); -// -// -// -// -// Pizza.PizzaBuilder builder = Mockito.mock(Pizza.PizzaBuilder.class, Mockito.RETURNS_DEEP_STUBS); -// -// Pizza pizza = Mockito.mock(Pizza.class); -// -// Mockito.when(builder -// .size(PizzaSize.LARGE) -// .withExtaTopping("Mushroom") -// .withStuffedCrust(false) -// .willCollect(true) -// .applyDiscount(20) -// .build()).thenReturn(pizza); -// -// PizzaService service = new PizzaService(builder); -// -// List listToppings = service.listToppings(); - - + @Test + public void givenTraditonalMocking_whenServiceInvoked_thenPizzaIsBuilt() { + PizzaBuilder nameBuilder = Mockito.mock(Pizza.PizzaBuilder.class); + PizzaBuilder sizeBuilder = Mockito.mock(Pizza.PizzaBuilder.class); + PizzaBuilder firstToppingBuilder = Mockito.mock(Pizza.PizzaBuilder.class); + PizzaBuilder secondToppingBuilder = Mockito.mock(Pizza.PizzaBuilder.class); + PizzaBuilder stuffedBuilder = Mockito.mock(Pizza.PizzaBuilder.class); + PizzaBuilder willCollectBuilder = Mockito.mock(Pizza.PizzaBuilder.class); + PizzaBuilder discountBuilder = Mockito.mock(Pizza.PizzaBuilder.class); + + PizzaBuilder builder = Mockito.mock(Pizza.PizzaBuilder.class); + when(builder.name(anyString())).thenReturn(nameBuilder); + when(nameBuilder.size(any(Pizza.PizzaSize.class))).thenReturn(sizeBuilder); + when(sizeBuilder.withExtraTopping(anyString())).thenReturn(firstToppingBuilder); + when(firstToppingBuilder.withStuffedCrust(anyBoolean())).thenReturn(stuffedBuilder); + when(stuffedBuilder.withExtraTopping(anyString())).thenReturn(secondToppingBuilder); + when(secondToppingBuilder.willCollect(anyBoolean())).thenReturn(willCollectBuilder); + when(willCollectBuilder.applyDiscount(anyInt())).thenReturn(discountBuilder); + when(discountBuilder.build()).thenReturn(expectedPizza); + + PizzaService service = new PizzaService(builder); + assertEquals("Expected Pizza", expectedPizza, service.orderHouseSpecial()); + + verify(builder).name(stringCaptor.capture()); + assertEquals("Pizza name: ", "Special", stringCaptor.getValue()); + + verify(nameBuilder).size(sizeCaptor.capture()); + assertEquals("Pizza size: ", PizzaSize.LARGE, sizeCaptor.getValue()); + + } + + @Test + public void givenDeepStubs_whenServiceInvoked_thenPizzaIsBuilt() { + Mockito.when(anotherbuilder.name(anyString()) + .size(any(Pizza.PizzaSize.class)) + .withExtraTopping(anyString()) + .withStuffedCrust(anyBoolean()) + .withExtraTopping(anyString()) + .willCollect(anyBoolean()) + .applyDiscount(anyInt()) + .build()) + .thenReturn(expectedPizza); + + PizzaService service = new PizzaService(anotherbuilder); + assertEquals("Expected Pizza", expectedPizza, service.orderHouseSpecial()); } } diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/fluentapi/PizzaUnitTest.java b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/fluentapi/PizzaUnitTest.java index fb909c34d3..1486cb7f2f 100644 --- a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/fluentapi/PizzaUnitTest.java +++ b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/fluentapi/PizzaUnitTest.java @@ -1,6 +1,8 @@ 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; @@ -9,35 +11,22 @@ import com.baeldung.mockito.fluentapi.Pizza.PizzaSize; public class PizzaUnitTest { @Test - public void givenPizza_whenBuilt_thenShouldReturnPizzaWithCorrectAttributes() { - Pizza pizza = new Pizza - .PizzaBuilder("Margherita") + public void givenFluentPizzaApi_whenBuilt_thenPizzaHasCorrectAttributes() { + Pizza pizza = new Pizza.PizzaBuilder() + .name("Margherita") .size(PizzaSize.LARGE) - .withExtaTopping("Mushroom") + .withExtraTopping("Mushroom") .withStuffedCrust(false) .willCollect(true) .applyDiscount(20) .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 - } - }