В чем разница между созданием RestTempate с помощью конструктора и со связыванием с помощью аннотации @Autowired?

315
20 февраля 2017, 16:45

Всем привет!

Тестирую сервис на рест запросы, и необходимо протестировать rest call что они по заданому uri корректно десериализируют объект. Дело в том, когда я объект RestTemplate подвешиваю аннотацией @Autowired, то тесты проходят, а когда создаю с помощью конструктора в самом методе, то тесты падают.

Вот пример теста:

@ContextConfiguration(classes = {RestTemplate.class, SimpleRestService.class})
public class SimpleRestServiceFunctionalTest extends AbstractJUnit4SpringContextTests {
@Autowired
private SimpleRestService simpleRestService;
@Autowired
private RestTemplate restTemplate;
private MockRestServiceServer mockServer;
@Before
public void setUp() {
    mockServer = MockRestServiceServer.createServer(restTemplate);
}
@Test
public void testGetMessage() {
    mockServer.expect(requestTo("https://google.com")).andExpect(method(HttpMethod.GET))
            .andRespond(withSuccess("resultSuccess", MediaType.TEXT_PLAIN));
    String result = simpleRestService.getMessage();
    System.out.println("result: "+result);
    mockServer.verify();
    assertThat(result, allOf(containsString("SUCCESS"), containsString("resultSuccess")));
}
@Test
public void testGetMessage_500() {
    mockServer.expect(requestTo("https://google.com")).andExpect(method(HttpMethod.GET))
            .andRespond(withServerError());
    String result = simpleRestService.getMessage();
    System.out.println("result: "+result);
    mockServer.verify();
    assertThat(result, allOf(containsString("FAILED"), containsString("500")));
}
@Test
public void testGetMessage_404() {
    mockServer.expect(requestTo("https://google.com")).andExpect(method(HttpMethod.GET))
            .andRespond(withStatus(HttpStatus.NOT_FOUND));
    String result = simpleRestService.getMessage();
    System.out.println("result: "+result);
    mockServer.verify();
    assertThat(result, allOf(containsString("FAILED"), containsString("404")));
}
}

Пример сервиса:(т.е. если здесь будет юзать resttemplate с помощью @Autowired, то все хорошо. а если буду создавать явно в методе resttemplate, то тесты упадут)

@Service
public class SimpleRestService {
//    @Autowired
//    private RestTemplate restTemplate;
public String getMessage() {
    RestTemplate restTemplate = new RestTemplate();
    String result;
    try {
        String httpResult = restTemplate.getForObject("https://google.com", String.class);
        result = "Message SUCCESS result: " + httpResult;
    } catch (HttpStatusCodeException e) {
        result = "Get FAILED with HttpStatusCode: " + e.getStatusCode() + "|" + e.getStatusText();
    } catch (RuntimeException e) {
        result = "Get FAILED\n" + ExceptionUtils.getFullStackTrace(e);
    }
    return result;
}
}

Вопрос: В чем разница в этих двух подходах? и второй вопрос: как протестировать этот сервис на валидное возвращения сообщения, если создавать RestTemplate явно в методе?

Answer 1

Дело в том, что @Autowired -- автоматически настраивает бобы. А с вашим подходом, вы просто создаете новую ссылку, когда этот боб может иметь какие либо другие бобы в конструкторе.

Вы можете протестировать этот боб явно в методе, если узнаете все его зависимости других бобов и будете добавлять их в конструктор. Но чем вас неустраивает @Autowired?

READ ALSO
Клавиша с двойным нажатием в Java

Клавиша с двойным нажатием в Java

Возможно ли в Java сделать так, чтобы при нажатии на одну и ту же клавишу клавиатуры происходили разные действияНапример при нажатии клавиши...

310
Как научиться получать данные с сервера в клиентское андроид приложение..?

Как научиться получать данные с сервера в клиентское андроид приложение..?

Хочу сделать приложение для сайтаНо сразу же столкнулся с проблемой

401
программируем звук в Android

программируем звук в Android

Здравствуйте! Написал код для звукаKомпилятор не кричит, все вроде нормально, но только звук почему то не воспроизводится на самом девайсе...

319
Заштриховать область (Java Graphics2D)

Заштриховать область (Java Graphics2D)

Есть нарисованный график, на нём обозначены границы некой области: Подумал, что можно с небольшим шагом сделать параллельные оси y линии,...

457