4
4
.
.
2
2
.
.
5
5
M
M
o
o
c
c
k
k
-
-
M
M
e
e
t
t
h
h
o
o
d
d
-
-
w
w
h
h
e
e
n
n
(
(
)
)
I
I
n
n
f
f
o
o
[
[
G
G
]
]
when() is used to Mock Method by specifying what should Method return for specific Input Parameters.
When Tested Method calls Mocked Method, Mocked Method will return value defined by Mockito's when() and not the
value from the real Method's Implementation.
when() is used to Mock Methods for both @Mock and @Spy Objects.
doReturn() is alternative to when() with different behavior in certain situations.
Application Schema [Result]
Spring Boot Starters
GROUP
DEPENDENCY
DESCRIPTION
Web
Spring Web
Enables: Controller Annotations, Tomcat Server
Syntax
when (personRepositoryMock.getPersonById(1)).thenReturn(new Person(1, "Susan", 50));
given(personRepositoryMock.getPersonById(1)).willReturn(new Person(1, "Susan", 50)); //Alias for when()
MyController
http://localhost:8080/GetPerson
getPerson()
Person
Browser
Tomcat
MyControllerTest
@Mock
PersonRepository
P
P
r
r
o
o
c
c
e
e
d
d
u
u
r
r
e
e
Create Project: springboot_mockito_when (add Spring Boot Starters from the table)
Create Package: entities (inside main package)
Create Class: Person.java (inside entities package)
Create Package: respositories (inside main package)
Create Class: PersonRepository.java (inside entities package)
Create Package: controllers (inside main package)
Create Class: MyController.java (inside controllers package)
Create Package: controllers (inside test package)
Create Test Class: MyControllerTest.java (inside controllers package)
Person.java
package com.ivoronline.springboot_mockito_when.entities;
public class Person {
//PROPERTIES
public Integer id;
public String name;
public Integer age;
//CONSTRUCTOR
public Person(Integer id, String name, Integer age) {
this.id = id;
this.name = name;
this.age = age;
}
}
PersonRepository.java
package com.ivoronline.springboot_mockito_when.controllers;
import com.ivoronline.springboot_mockito_when.entities.Person;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
@Component
public class PersonRepository {
//PROPERTY
Map<Integer, Person> persons = new HashMap();
//CONSTRUCTOR
public PersonRepository() {
persons.put(1, new Person(1, "John", 20));
persons.put(2, new Person(2, "Bill", 30));
persons.put(3, new Person(2, "Jack", 40));
}
//GET PERSON BY ID
public Person getPersonById(Integer id) {
return persons.get(id);
}
}
MyController.java
package com.ivoronline.springboot_mockito_when.controllers;
import com.ivoronline.springboot_mockito_when.entities.Person;
import com.ivoronline.springboot_mockito_when.repositories.PersonRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class MyController {
@Autowired PersonRepository personRepository;
@ResponseBody
@RequestMapping("/GetPerson")
public String getPerson(@RequestParam Integer id) {
//GET PERSON
Person person = personRepository.getPersonById(id);
String name = person.name;
Integer age = person.age;
//RETURN SOMETHING
return name + " is " + age + " years old";
}
}
MyControllerTest.java
package com.ivoronline.springboot_mockito_when.controllers;
import com.ivoronline.springboot_mockito_when.entities.Person;
import com.ivoronline.springboot_mockito_when.repositories.PersonRepository;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.springframework.boot.test.context.SpringBootTest;
import org.mockito.Mock;
import static org.mockito.Mockito.when;
import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest
class MyControllerTest {
//MOCK DEPENDENCY CLASS
@Mock PersonRepository personRepositoryMock;
//INJECT MOCKS (where @autowired is used)
@InjectMocks
MyController myController;
@Test
void getPerson() {
//MOCK METHOD: getPersonById(1)
when(personRepositoryMock.getPersonById(1)).thenReturn(new Person(1, "Susan", 50));
//TEST CONTROLLER'S ENDPOINT
String result = myController.getPerson(1);
//TEST RESULT
assertEquals("Susan is 50 years old", result);
}
}
R
R
e
e
s
s
u
u
l
l
t
t
http://localhost:8080/GetPerson?id=1
Run Test Class: MyControllerTest.java
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>