简体   繁体   中英

Java Spring Boot: testing service

I'm having issues testing a service because I can't seem to be able to mock the service response with a RestTemplate .

Here's the service code:

@Service
public class PricingServiceImpl implements PricingService {
    private static final String URL = "http://127.0.0.1:4000/pricing?countryCode=";
    @Autowired
    RestTemplate restTemplate;

    @Override
    public ResponseEntity<BigDecimal> getPricing(String countryCode) {
        return restTemplate.exchange(URL + countryCode, HttpMethod.GET, null, new ParameterizedTypeReference<BigDecimal>() {
        });
    }
}

Here's the test code:

@ExtendWith(MockitoExtension.class)
@RunWith(SpringRunner.class)
public class PricingServiceImplTest {
    @InjectMocks
    private PricingService pricingService = new PricingServiceImpl();
    @Mock
    private RestTemplate restTemplate;

    @Before
    public void setUp() {
        PricingResponse pricingResponse = new PricingResponse();
        pricingResponse.setPrice(BigDecimal.TEN);
        Mockito.when(restTemplate.exchange(any(), eq(HttpMethod.GET), any(), any(ParameterizedTypeReference.class))).thenReturn(new ResponseEntity<>(pricingResponse, HttpStatus.OK));
    }

    @Test
    public void test() {
        ResponseEntity<BigDecimal> result = pricingService.getPricing("NL");
        Assertions.assertNotNull(result);
    }
}

I'm simply trying to assert that result isn't null so I can make sure I'm doing something correct, but it's not working, as the result is always null.

Thanks a lot in advance!

EDIT:

I've modified the test class to use a setter for the RestTemplate but still the service is returning null:

@RunWith(MockitoJUnitRunner.class)
public class PricingServiceImplTest {
    private PricingServiceImpl pricingService = new PricingServiceImpl();
    @Mock
    private RestTemplate restTemplate;

    @Before
    public void setUp() {
        PricingResponse pricingResponse = new PricingResponse();
        pricingResponse.setPrice(BigDecimal.TEN);
        Mockito.when(restTemplate.exchange(any(), eq(HttpMethod.GET), any(), any(ParameterizedTypeReference.class))).thenReturn(new ResponseEntity<>(pricingResponse, HttpStatus.OK));
    }

    @Test
    public void test() {
        pricingService.setRestTemplate(restTemplate);
        ResponseEntity<BigDecimal> result = pricingService.getPricing("NL");
        Assertions.assertNotNull(result);
    }
}

Try the following approach

pricingService.setRestTemplate(restTemplate);

It looks like you are trying to mock the RestTemplate object in your test, but the PricingServiceImpl is still using the real RestTemplate object that is autowired in the class.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM