Написание теста производителя для конечной точки облачного контракта с использованием Spring cloud contract

#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. Так что имитируйте только один сервис. Я не понимаю проблему.