Soap интеграционные тесты загружают только проверенную конечную точку, а не все конечные точки - PullRequest
2 голосов
/ 28 января 2020

У меня есть вопрос: что будет правильной конфигурацией для загрузки только класса Enpoint, который я хочу протестировать в этом интеграционном тесте, а не полного контекста приложения (не всех классов Enpoint)? Прямо сейчас у меня есть:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {WebServiceConfigTest.class}, properties = {"application.address=http://hostname:port/context"})
public class MyEndpointTest {

@Autowired
private ApplicationContext applicationContext;

private MockWebServiceClient mockClient;


@Before
public void init() {
    mockClient = MockWebServiceClient.createClient(applicationContext);
    MockitoAnnotations.initMocks(this);
}
@Test
public void test1(){}
....
}

в WebServiceConfigTest:

@ComponentScan("mypackages.soap")
@ContextConfiguration(classes = SoapApplication.class)
@MockBean(classes = {MyService.class})
public class WebServiceConfigTest {
}

SoapApplication:

@ComponentScan({"mypackages"})
@SpringBootApplication
public class SoapApplication extends SpringBootServletInitializer implements WebApplicationInitializer {

 public static void main(String[] args) {
     SpringApplication.run(SoapApplication.class, args);
 }
}

Причина в том, что в Soap модуле у меня есть зависимость модуля Service, которая имеет другие зависимости, и так далее. Если я загружаю весь ApplicaitonContext, то:

  • либо мне нужно смоделировать полный список сервисов, которые я использую в Soap модуле
  • , либо издеваться над зависимостями модуля Сервиса такие как DataSource, Queues et c.

Если я сделаю второй, модуль Soap узнает о вещах, которых не должно быть. Если я делаю первое, я вынужден издеваться и поддерживать в файле теста конфигурации полный список используемых Сервисов, который может быть длинным.

Любые советы здесь?

Ответы [ 2 ]

1 голос
/ 28 января 2020

Какая будет правильная конфигурация для загрузки только класса Endpoint, который я хочу протестировать в этом интеграционном тесте, а не полного контекста приложения

, который вы можете задать пружине только конкретному экземпляру Controller класс, но без загрузки полного контекста приложения с использованием @ WebMvcTest (MyEndpoint.class)

@RunWith(SpringRunner.class)
@WebMvcTest(MyEndpoint.class)
public class MyEndpointTest {

 @MockBean //mock all service beans that are injected into controller
 private Service service;

 @Autowired
 private MockMvc mockMvc;

   @Test
   public void test1(){}
      ....
   }
}

Я бы также рекомендовал выполнять сквозное интеграционное тестирование с использованием @SpringBootTest, если Вы используете встроенную базу данных (например, H2) или встроенные очереди для тестирования

0 голосов
/ 29 января 2020

После долгих поисков и испытаний я нашел решение. Поскольку вы можете попросить Spring on REST загрузить только 1 контроллер в контекст с

@WebMvcTest(MyController.class) 

, то же самое можно сделать для Soap с

@SpringBootTest(classes = {MyEndpoint.class}) 

Он загрузит только Конечная точка, которую вы хотите, и вы можете смоделировать Услуги, которые вы используете внутри нее, или вы можете go вплоть до Репозитория, o независимо от того, что там делает логика вашего Бизнес-приложения c.

...