Reputation: 123
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
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