tony
tony

Reputation: 123

How to used Mockito for restTemplateBuilder in Spring Boot

I have a spring rest consumer as below.

In this service, we need to use another autowired service.

How to mock the response for the restTemplate?

@Service
public class TestConsumer {

    private final RestTemplate restTemplate;
    
    @Autowired
    private AccountService accountService;
    
    public TestConsumer(RestTemplateBuilder restTemplateBuilder) {
        restTemplate = restTemplateBuilder.basicAuthentication("username", "password")
                .rootUri("https://example.com").build();
    }
    
    public String testGet() {
        
        Account account = accountService.getAccount();
        String r = "";
        if("Admin".equals(account.getType())) {
            r = restTemplate.getForObject("AAA", String.class);
        }else {
            r = restTemplate.getForObject("BBB", String.class);
        }
        return r;
    }
}

Upvotes: 2

Views: 1153

Answers (1)

João Dias
João Dias

Reputation: 17460

I would suggest you also make AccountService a constructor argument to make it easier to test your class:

@Service
public class TestConsumer {

    private final RestTemplate restTemplate;
    
    private AccountService accountService;
    
    public TestConsumer(RestTemplateBuilder restTemplateBuilder, AccountService accountService) {
        restTemplate = restTemplateBuilder.basicAuthentication("username", "password")
                .rootUri("https://example.com").build();
        this.accountService = accountService;
    }
    
    public String testGet() {
        
        Account account = accountService.getAccount();
        String r = "";
        if("Admin".equals(account.getType())) {
            r = restTemplate.getForObject("AAA", String.class);
        }else {
            r = restTemplate.getForObject("BBB", String.class);
        }
        return r;
    }
}    

Then I would mock both RestTemplateBuilder and RestTemplate as follows:

public class TestConsumerTest {

    @Mock
    private RestTemplate restTemplate;

    @Mock
    private RestTemplateBuilder restTemplateBuilder;

    @Mock
    private AccountService accountService;

    private TestConsumer testConsumer;

    @BeforeEach
    public void setUp() {
        MockitoAnnotations.initMocks(this);

        // Mock RestTemplateBuilder behaviour
        doReturn(this.restTemplateBuilder).when(this.restTemplateBuilder).basicAuthentication(anyString(), anyString());
        doReturn(this.restTemplateBuilder).when(this.restTemplateBuilder).rootUri(anyString());
        doReturn(this.restTemplate).when(this.restTemplateBuilder).build();

        // Mock RestTemplate behaviour
        doReturn("whatever-string").when(this.restTemplate).getForObject(eq("AAA"), eq(String.class));
        doReturn("whatever-another-string").when(this.restTemplate).getForObject(eq("BBB"), eq(String.class));
        
        this.testConsumer = new TestConsumer(restTemplateBuilder, accountService);
    }

    // Your tests
}    

Upvotes: 1

Related Questions