4
4
.
.
2
2
.
.
7
7
M
M
o
o
c
c
k
k
-
-
M
M
e
e
t
t
h
h
o
o
d
d
-
-
d
d
o
o
R
R
e
e
t
t
u
u
r
r
n
n
(
(
)
)
I
I
n
n
f
f
o
o
[
[
G
G
]
]
This tutorial shows how to use
@Mock to Mock Class @Mock PersonRepository personRepositoryMock
@InjectMocks to Inject Instance of Mocked Class @InjectMocks MyController myController
doReturn() to Mock Method of Mocked Class doReturn(...).when(personRepositoryMock).getPersonById(1);
@InjectMocks looks for @Autowired PersonRepository personRepository & inserts instance of Mocked Class in Controller
When Controller calls personRepository.getPersonById(1) then Mocked Method of Mocked Class is called.
when() is alternative to doReturn() with different behavior in certain situations.
Application Schema [Result]
Spring Boot Starters
GROUP
DEPENDENCY
DESCRIPTION
Web
Spring Web
Enables: Controller Annotations, Tomcat Server
Syntax
doReturn(new Person(1, "Susan", 50)).when(personRepositoryMock).getPersonById(1);
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_doreturn (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 src\test\java\com.ivoronline.springboot_junit)
Create Test Class: MyControllerTest.java (inside entities package)
Person.java
package com.ivoronline.springboot_mockito_doreturn.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_doreturn.respositories;
import com.ivoronline.springboot_mockito_doreturn.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_doreturn.controllers;
import com.ivoronline.springboot_mockito_doreturn.entities.Person;
import com.ivoronline.springboot_mockito_doreturn.respositories.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_doreturn.controllers;
import com.ivoronline.springboot_mockito_doreturn.entities.Person;
import com.ivoronline.springboot_mockito_doreturn.respositories.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.doReturn;
import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest
class MyControllerTest {
//MOCK CLASS
@Mock PersonRepository personRepositoryMock;
//INJECT MOCKS (where @autowired is used)
@InjectMocks MyController myController;
@Test
void getPerson() {
//MOCK REPOSITORY METHOD (getPersonById(1) returns Susan instead John for id=1)
doReturn(new Person(1, "Susan", 50)).when(personRepositoryMock).getPersonById(1);
//TEST CONTROLLER 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>