Search code examples
resttemplatespring-boot-testspring-resttemplate

mock bean unable to inject dependecy in unit test


I want to test my spring boot application using TestRestemplate, however I am unable to test get url, what I am trying to do here is I am injecting some predefine objects setting into list and mocking find all method.

below is my test code looks like.

import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.when;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

import org.junit.Before;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ActiveProfiles("test")
public class PersonControllerTests {

    
    @Autowired
    private TestRestTemplate restTemplate;
    
    @MockBean
    private PersonRepository mockRepository;
    
    @Before
    public void init() {
        List<Person> list = new ArrayList<>();
        Person p1 = new Person("dumm1", "lastName1",22);
        Person p2 = new Person("dumm2", "lastName2",32);
        p1.setId(1l);
        list.add(p2);
        list.add(p1);
        when(mockRepository.findAll()).thenReturn(list);
        
    }

    @Test
    public void getPersonsGoodReq() throws Exception {
    
    ResponseEntity<Person[]> response = restTemplate
            .withBasicAuth("admin", "password")
            .getForEntity("/persons/all", Person[].class);
    assertEquals(HttpStatus.OK, response.getStatusCode());
    assertEquals(response.getBody().length, 2);
    }
    
}

I am expecting answer to be 2, but when I am seeing body response it is empty array.

what might have gone wrong I am unable to get


Solution

  • As you're using JUnit Jupiter, you have to use @BeforeEach. @Before is from JUnit 4 and hence wasn't invoked as part of the test's lifecycle:

    @BeforeEach
    public void init() {
        List<Person> list = new ArrayList<>();
        Person p1 = new Person("dumm1", "lastName1",22);
        Person p2 = new Person("dumm2", "lastName2",32);
        p1.setId(1l);
        list.add(p2);
        list.add(p1);
        when(mockRepository.findAll()).thenReturn(list);
        
    }