2016-08-30 8 views
3

Я использую spring-boot 1.4.0.RELEASE. Вот мой тестовый классNullPointerException при использовании аннотации SpringBootTest с помощью WebEnvironment

@RunWith(SpringRunner.class) 
@SpringBootTest(webEnvironment= WebEnvironment.RANDOM_PORT) 
@WebAppConfiguration 
public class ApplicationTests { 

    @Test 
    public void contextLoads() { 
    } 

} 

, когда я запускаю это тесты (хотя она ничего не делает сейчас), тест терпят неудачу в запуске из-за NullpointerException (трассировки стека ниже)

Однако, если удалить webEnvironment= WebEnvironment.RANDOM_PORT, все выглядит хорошо.

StackTrace:

java.lang.IllegalStateException: Failed to load ApplicationContext 

    at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:124) 
    at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:83) 
    at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:189) 
    at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:131) 
    at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:230) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:228) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:287) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:289) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:247) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) 
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191) 
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137) 
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:119) 
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:42) 
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:234) 
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:74) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) 
Caused by: java.lang.NullPointerException 
    at org.springframework.test.context.web.socket.MockServerContainerContextCustomizer.customizeContext(MockServerContainerContextCustomizer.java:38) 
    at org.springframework.boot.test.context.SpringBootContextLoader$ContextCustomizerAdapter.initialize(SpringBootContextLoader.java:270) 
    at org.springframework.boot.SpringApplication.applyInitializers(SpringApplication.java:633) 
    at org.springframework.boot.SpringApplication.prepareContext(SpringApplication.java:347) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:311) 
    at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:111) 
    at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:98) 
    at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:116) 
    ... 29 more 
+1

Пожалуйста, объясните причину, чтобы использовать 'webEnvironment' и' @ WebAppConfiguration'. –

ответ

5

Вам не нужно @WebAppConfiguration с поддержкой тестирования Spring ботинка версии 1.4.

Так просто удалить @WebAppConfiguration, а затем ...

  • если вы хотите издевались WebApplicationContext - например, использовать MockMvc - использовать @SpringBootTest с по умолчанию webEnvironment (который WebEnvironment.MOCK).
  • , если вы хотите, чтобы ваш веб-приложение на самом деле быть развернута во встроенном контейнере сервлетов - например, для тестирования с TestRestTemplate - использовать @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) или @SpringBootTest(webEnvironment = WebEnvironment.DEFINED_PORT)
+0

Также см. Проблему Spring Boot по этому вопросу: https://github.com/spring-projects/spring-boot/issues/6795 –

+0

Что делать, если мне нужно testrestTemplate и mockMvc? с TestRestTemplate, я не могу утверждать код статуса? с mockMvc я могу. но с TestRestTemplate, я могу утверждать для ответа 'Status status = this.restTemplate.getForObject ("/health ", Status.class);' который я не могу с mockMvc –

+0

Не имеет смысла использовать 'TestRestTemplate' и' MockMvc 'в том же тесте. Первый * только * работает с работающим сервером; тогда как последний * только * работает без работающего сервера. –