How to mock RestTemplate in Java Spring?

前端 未结 3 1654
一向
一向 2020-12-03 05:29
public class ServiceTest {
    @Mock
    RestTemplate restTemplate = new RestTemplate();
    @InjectMocks
    Service service = new Service();
    ResponseEntity res         


        
相关标签:
3条回答
  • 2020-12-03 05:55

    If you use @Autowired, you could use MockRestServiceServer. The below is the sample.

    @Service
    public class Service{
        @Autowired
        private RestTemplate restTemplate;
    
        public boolean isEnabled(String xxx) {
            ResponseEntity<String> response = restTemplate.getForEntity("someurl",String.class);
            if(...)return true;
            return false;
        }
    }
    

    @Service needs to use @Autowired for creating object automatically.

    0 讨论(0)
  • 2020-12-03 05:56

    The problem is that in your isEnabled you are creating a new RestTemplate. This is wrong for two reasons, one is that you cannot mock it since you are creating a new one, and second it is good to avoid creating new objects per request. RestTemplate is thread safe and hence can be a service class member, being used across many threads.

    Change your service class to something like this:

    public class Service{
    
        RestTemplate restTemplate = new RestTemplate();
    
        public boolean isEnabled(String xxx) {
            ResponseEntity<String> response = restTemplate.getForEntity("someurl",String.class);
            if(...)return true;
            return false;
        }
    }
    

    Now that your RestTemplate has become a class member you can now properly mock through one of two ways. One, inject it using the @InjectMock, or use a setter method that you call from your test.

    Since you are using InjectMock in your code we can go with that.

    @RunWith(MockitoJUnitRunner.class) 
    public class ServiceTest {
        @Mock
        RestTemplate restTemplate;
        @InjectMocks
        @Spy
        Service service;
        ResponseEntity responseEntity = mock(ResponseEntity.class);
    
        @Test
        public void test() throws Exception {
            Mockito.when(restTemplate.getForEntity(
                    Mockito.anyString(),
                    ArgumentMatchers.any(Class.class)
                    ))
                    .thenReturn(responseEntity);
            boolean res = service.isEnabled("something");
            Assert.assertEquals(res, false);
        }
    

    Notice that I made a few changes. First, I removed the new RestTemplate() and new Service(). You should let mockito create those for you. By annotating them with @Mock and @Spy you will ensure that Mockito will create them for you, and more importantly, will inject the mocks into your service object.

    0 讨论(0)
  • 2020-12-03 06:01

    Spring MVC's test framework has offered the class MockRestServiceServer for unit testing RESTful service code.

    Here is a tutorial on its use.

    0 讨论(0)
提交回复
热议问题