#java #spring #spring-boot #spring-cloud-contract #contract
#java #spring #spring-boot #spring-cloud-contract #контракт
Вопрос:
Я пишу контракт Spring Cloud в существующий проект. Когда я достигаю конечной точки, все работает нормально, но я сталкиваюсь с проблемой настройки стороны обмена сообщениями для производителя.
В моем контроллере у меня есть следующий фрагмент кода
{
StudentInfo studentInfo = new StudentInfo();
studentInfo.setProfileId(studId);
studentInfo.setClassDetails(studentService.getClassDetailsInfo(studId));
studentInfo.setMarksInfo(studentService.getMarksInfo(studId));
return employerInfo; }
}
Это существующий код конечной точки в контроллере, который я не могу изменить.
Поскольку в методе вызываются два вызова службы, я не могу понять, как я могу написать метод производителя, который будет имитировать ответ обеих служб и создавать JSON.
Вот мой код производителя
StudentInfo mockStudentsResponse = JUnitTestUtil
.toObject(JUnitTestUtil.getFile("studentInfo.json"), StudentInfo .class); // This student info has two class objects inside it 1. ClassDetails and 2.MarksInfo
//How can I mock the response and to which service class
Любые идеи будут высоко оценены.
Комментарии:
1. Почему вы не можете имитировать вызовы служб? Вы не должны создавать эти
2. @MarcinGrzejszczak, не могли бы вы, пожалуйста, опубликовать пример фрагмента о том, как вы имитируете два вызова службы и объединяете их вместе
3. Просто использовать Mockito? A a = Mockito.mock(A.class ); Mockito.when(…).thenReturn(…). Затем внедрите mocks в контроллер. Вы также можете создать fakr impls, как здесь github.com/spring-cloud-samples/spring-cloud-contract-samples /…
4. @Marcin Не могли бы вы пояснить, как это может вписаться, выполнив два вызова службы.
5. Я предоставил ответ
Ответ №1:
Вы должны макетировать службы внутри вашего контроллера. Когда я говорю service, я имею в виду службу приложений. На вашем контроллере должны быть издевательские службы приложений. Таким образом, вы отправляете запрос на контроллер, затем обработка этого запроса заканчивается в контроллере. Он не переходит ни на какие другие уровни, не говоря уже о вызове в других приложениях.
Пример
@RestController
class MyController {
private final Service1 service1;
private final Service2 service2;
@GetMapping("/bla")
String bla() {
String a = service1.a();
String b = service2.b(a);
return a b;
}
}
Затем в базовом классе вы делаете
class MyBaseClass {
Service1 service1 = Mockito.mock(Service1.class);
Service2 service2 = Mockito.mock(Service2.class);
@BeforeEach
void setup() {
Mockito.when(service1.a()).thenReturn("foo");
Mockito.when(service2.b()).thenReturn("bar");
RestAssuredMockMvc.standaloneSetup(new MyController(service1, service2));
}
}
Комментарии:
1. Спасибо, Марчин, но в контроллере есть только одна служба, и я не могу изменить контроллер. Я могу написать только RestBaseClass only
2. Так что имитируйте только один сервис. Я не понимаю проблему.