Skip to content

Commit 900d46e

Browse files
Added BDD examples
1 parent 3b79fbc commit 900d46e

File tree

9 files changed

+174
-6
lines changed

9 files changed

+174
-6
lines changed

Tutorial2-1Mockito/src/test/java/com/smarttoolfactory/tutorial2_1mockito/Test8ResetingMock.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,8 @@ public void testAddAndSubtract(){
3838
//reset the mock
3939
reset(calcService);
4040

41-
4241
/*
43-
🔥 Fails because mock is reset and when function, should be called again
42+
🔥 FAILs because mock is reset and when function, should be called again
4443
when(calcService.add(20.0,10.0)).thenReturn(30.0);
4544
4645
*/

Tutorial2-1Mockito/src/test/java/com/smarttoolfactory/tutorial2_1mockito/TestArgumentCaptor.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@
1212
import org.junit.Test;
1313
import org.mockito.ArgumentCaptor;
1414
import org.mockito.Captor;
15-
import org.mockito.Mock;
16-
import org.mockito.Mockito;
1715
import org.mockito.junit.MockitoJUnit;
1816
import org.mockito.junit.MockitoRule;
1917

Tutorial2-1Mockito/src/test/java/com/smarttoolfactory/tutorial2_1mockito/TestVoidMethod.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ public void testSetName_With_doNothing_ArgumentCaptor() {
8686

8787
// Assert
8888
assertEquals(USER_NAME, actual);
89+
verify(employee, times(1)).setName(argumentCaptor.getValue());
8990

9091

9192
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.smarttoolfactory.tutorial2_2mockito_bdd.model_login_manager;
2+
3+
public interface ILoginManager {
4+
5+
User login(String email, String password);
6+
7+
String validate(String email, String password);
8+
9+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.smarttoolfactory.tutorial2_2mockito_bdd.model_login_manager;
2+
3+
public class LoginManagerImpl {
4+
5+
ILoginManager loginManager;
6+
7+
public User login(String email, String password) {
8+
return loginManager.login(email, password);
9+
}
10+
11+
public String validate(String email, String password) {
12+
return loginManager.validate(email, password);
13+
}
14+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.smarttoolfactory.tutorial2_2mockito_bdd.model_login_manager;
2+
3+
public class User {
4+
5+
public String email;
6+
public String password;
7+
8+
public User(String email, String password) {
9+
this.email = email;
10+
this.password = password;
11+
}
12+
}

Tutorial2-2Mockito-BDD/src/test/java/com/smarttoolfactory/tutorial2_2mockito_bdd/Test2ExceptionHandling.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import com.smarttoolfactory.tutorial2_2mockito_bdd.model_math_application.CalculatorService;
44
import com.smarttoolfactory.tutorial2_2mockito_bdd.model_math_application.MathApplication;
55

6-
import org.junit.Assert;
76
import org.junit.Test;
87
import org.junit.runner.RunWith;
98
import org.mockito.InjectMocks;
@@ -44,7 +43,7 @@ public void testAdd_throws_RuntimeException() {
4443
System.out.println("RunTime Exception is thrown");
4544
}
4645

47-
then(calcService).should(times(1)).add(10.0,20.0);
46+
then(calcService).should(times(1)).add(10.0, 20.0);
4847

4948
}
5049
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package com.smarttoolfactory.tutorial2_2mockito_bdd;
2+
3+
import com.smarttoolfactory.tutorial2_2mockito_bdd.model_math_application.CalculatorService;
4+
import com.smarttoolfactory.tutorial2_2mockito_bdd.model_math_application.MathApplication;
5+
6+
import org.junit.Assert;
7+
import org.junit.Before;
8+
import org.junit.Test;
9+
import org.junit.runner.RunWith;
10+
import org.mockito.junit.MockitoJUnitRunner;
11+
12+
import static org.hamcrest.Matchers.closeTo;
13+
import static org.junit.Assert.assertThat;
14+
import static org.mockito.BDDMockito.*;
15+
import static org.mockito.Mockito.spy;
16+
17+
@RunWith(MockitoJUnitRunner.class)
18+
public class Test5Spying {
19+
20+
private MathApplication mathApplication;
21+
private CalculatorService calcService;
22+
23+
@Before
24+
public void setUp() {
25+
mathApplication = new MathApplication();
26+
Calculator calculator = new Calculator();
27+
28+
// 🔥 We use real object
29+
calcService = spy(calculator);
30+
mathApplication.setCalculatorService(calcService);
31+
}
32+
33+
@Test
34+
public void testAdd() {
35+
36+
37+
// Given
38+
// 🔥🔥 Adding stub FAILS the test with UnnecessaryStubbingException
39+
// given(calcService.add(10.0, 20.0)).willReturn(30.00);
40+
41+
// When
42+
double expected = mathApplication.add(20.0, 10.0);
43+
44+
// Then
45+
assertThat(expected, closeTo(30.0, 0.0));
46+
// Both PASS if invoked one at a time
47+
then(calcService).should(times(1)).add(anyDouble(), anyDouble());
48+
// then(calcService).should(times(1)).add(10.0, 10.0);
49+
50+
}
51+
52+
class Calculator implements CalculatorService {
53+
@Override
54+
public double add(double input1, double input2) {
55+
return input1 + input2;
56+
}
57+
58+
@Override
59+
public double subtract(double input1, double input2) {
60+
throw new UnsupportedOperationException("Method not implemented yet!");
61+
}
62+
63+
@Override
64+
public double multiply(double input1, double input2) {
65+
throw new UnsupportedOperationException("Method not implemented yet!");
66+
}
67+
68+
@Override
69+
public double divide(double input1, double input2) {
70+
throw new UnsupportedOperationException("Method not implemented yet!");
71+
}
72+
}
73+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package com.smarttoolfactory.tutorial2_2mockito_bdd;
2+
3+
import com.smarttoolfactory.tutorial2_2mockito_bdd.model_login_manager.ILoginManager;
4+
import com.smarttoolfactory.tutorial2_2mockito_bdd.model_login_manager.LoginManagerImpl;
5+
6+
import org.junit.Test;
7+
import org.junit.runner.RunWith;
8+
import org.mockito.ArgumentCaptor;
9+
import org.mockito.Captor;
10+
import org.mockito.InjectMocks;
11+
import org.mockito.Mock;
12+
import org.mockito.invocation.InvocationOnMock;
13+
import org.mockito.junit.MockitoJUnitRunner;
14+
import org.mockito.stubbing.Answer;
15+
16+
import java.util.List;
17+
18+
import static org.hamcrest.MatcherAssert.assertThat;
19+
import static org.hamcrest.Matchers.*;
20+
import static org.mockito.ArgumentMatchers.*;
21+
import static org.mockito.BDDMockito.*;
22+
23+
24+
@RunWith(MockitoJUnitRunner.class)
25+
public class Test6ArgumentCaptor {
26+
27+
@InjectMocks
28+
LoginManagerImpl loginManagerImpl;
29+
30+
@Mock
31+
ILoginManager iLoginManager;
32+
33+
34+
@Captor
35+
private ArgumentCaptor<String> argumentCaptor;
36+
37+
38+
@Test
39+
public void validate() {
40+
41+
// Given
42+
given(iLoginManager.validate(argumentCaptor.capture(), argumentCaptor.capture()))
43+
.willAnswer((Answer<String>) invocation -> {
44+
List<String> credentials = argumentCaptor.getAllValues();
45+
return credentials.get(0) + "-" + credentials.get(1);
46+
});
47+
48+
49+
// When
50+
String expected = loginManagerImpl.validate("hello", "world");
51+
// 🔥🔥 argumentCaptor MUST be called after mock method is called
52+
List<String> credentials = argumentCaptor.getAllValues();
53+
54+
// Then
55+
then(iLoginManager).should().validate(credentials.get(0), credentials.get(1));
56+
57+
assertThat(expected, is("hello-world"));
58+
59+
60+
}
61+
62+
63+
}

0 commit comments

Comments
 (0)