Тестирование интеграции веб-приложения Spring Boot с помощью TestNG

недавно мы интегрировали наше приложение с spring boot. Наши тестовые примеры основаны на TestNG framework. Наш базовый тестовый класс выглядит следующим образом

@SpringApplicationConfiguration(classes = Application.class)
  @ActiveProfiles(profiles = "test")
  @WebAppConfiguration
  @IntegrationTest
  public class BaseTestCase extends AbstractTestNGSpringContextTests {
  }

мы определили вышеуказанный класс для настройки активного профиля и загрузки контекста приложения. Все классы тестов интеграции расширяют BaseTestCase

один из наших основных тестовых случаев выглядит как ниже

 @Test
   public void testPing() throws Exception{
      RestTemplate restTemplate = new RestTemplate();
      String response = restTemplate.getForObject(
                <some url>,
                String.class);
      Assert.assertNotNull(response);
    }

когда мы запускаем вышеуказанный тестовый случай, мы получаем следующее исключение

FAILED CONFIGURATION: @BeforeClass springTestContextPrepareTestInstance
java.lang.IllegalStateException: The WebApplicationContext for test context [DefaultTestContext@11b72c96 testClass = DataResourceTest, testInstance = com.xactly.insights.resource.imp.DataResourceTest@5b630a31, testMethod = [null], testException = [null], mergedContextConfiguration = [WebMergedContextConfiguration@10d034f0 testClass = DataResourceTest, locations = '{}', classes = '{class com.xactly.insights.app.Application}', contextInitializerClasses = '[]', activeProfiles = '{test}', resourceBasePath = 'src/main/webapp', contextLoader = 'org.springframework.boot.test.SpringApplicationContextLoader', parent = [null]]] must be configured with a MockServletContext.
    at org.springframework.util.Assert.state(Assert.java:385)
    at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:166)
    at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:101)
    at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:331)
    at org.springframework.test.context.testng.AbstractTestNGSpringContextTests.springTestContextPrepareTestInstance(AbstractTestNGSpringContextTests.java:146)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:84)
    at org.testng.internal.Invoker.invokeConfigurationMethod(Invoker.java:564)
    at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:213)
    at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:138)
    at org.testng.internal.TestMethodWorker.invokeBeforeClassMethods(TestMethodWorker.java:175)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:107)
    at org.testng.TestRunner.privateRun(TestRunner.java:767)
    at org.testng.TestRunner.run(TestRunner.java:617)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:334)
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329)
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291)
    at org.testng.SuiteRunner.run(SuiteRunner.java:240)
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1224)
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1149)
    at org.testng.TestNG.run(TestNG.java:1057)
    at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:111)
    at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:204)
    at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:175)

мы используем spring boot версии 1.1.5.Релиз и версия для TestNG 6.1.1. Может кто-нибудь пролить свет на то, как решить проблему?

2 ответов


проблема в том, что, по умолчанию, AbstractTestNGSpringContextTests позволяет ServletTestExecutionListener. Этот слушатель предоставляет mock поддержка API сервлетов для ваших тестов. Это не подходит в этом случае, поскольку вы запускаете тест интеграции Spring Boot, где для вас запускается встроенный сервер Tomcat, предоставляя вам подлинный ServletContext. Это приводит к неудаче, которую вы видите как ServletTestExecutionListener утверждает, что ServletContext - это MockServletContext экземпляра.

вы можете устранить проблему, отключив наследование AbstractTestNGSpringContextTestsпрослушиватели выполнения тестов и явная их настройка с помощью :

@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
@IntegrationTest
@TestExecutionListeners(inheritListeners = false, listeners = {
       DependencyInjectionTestExecutionListener.class,
       DirtiesContextTestExecutionListener.class })
public class BaseTestCase extends AbstractTestNGSpringContextTests {

}

У меня была та же проблема. Удивительно, что для меня работало создание класса SpringContextLoadingTest, размещение всех аннотаций там и расширение этого класса вместо AbstractTestNGSpringContextTests