WebApplicationContext не выполняет Autowire при внедрении в спецификации Spock

Хотя я следовал Руководству по загрузке Spring, когда пытался:

@SpringApplicationConfiguration(classes=MainWebApplication.class, initializers = ConfigFileApplicationContextInitializer.class)
@WebAppConfiguration
@ActiveProfiles("integration-test")

class FirstSpec extends Specification{
  @Autowired
  WebApplicationContext webApplicationContext

  @Shared
  MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build()

  def "Root returns 200 - OK"(){

      when:
      response = mockMvc.perform(get("/"))

      then:
      response.andExpect(status().isOk())
  }
}

Я просто получаю сообщение о том, что WebApplicationContext просто не вводится. я должен

    <dependency>
        <groupId>org.spockframework</groupId>
        <artifactId>spock-spring</artifactId>
    </dependency>
    <dependency>
        <groupId>org.spockframework</groupId>
        <artifactId>spock-maven</artifactId>
        <version>0.7-groovy-2.0</version>
    </dependency>

В моем .пом тоже, как советует гайд, пока безуспешно. Что-то я пропустил? Мне нужен контекст приложения, чтобы все компоненты были введены. Любые идеи?


person thomi    schedule 12.07.2016    source источник
comment
Дубликат stackoverflow .com/questions/24405727/?   -  person Andy Wilkinson    schedule 13.07.2016
comment
Маловероятно, так как я безуспешно пробовал этот обходной путь.   -  person thomi    schedule 13.07.2016


Ответы (2)


Можете ли вы попробовать перенести конструкцию mockMvc в метод setup?

def setup() {
    mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build()
}
person Deepak Sarda    schedule 14.07.2016

Вы также можете использовать аннотацию SpringBean, доступную в Spock 1.2: https://objectpartners.com/2018/06/14/spock-1-2-annotations-for-spring-integration-testing/

с этим может быть проще:

@SpringApplicationConfiguration(classes=MainWebApplication.class, initializers = ConfigFileApplicationContextInitializer.class)
@WebMvcTest
@AutoConfigureMockMvc
@WebAppConfiguration
@ActiveProfiles("integration-test")

class FirstSpec extends Specification{
  @Autowired
  WebApplicationContext webApplicationContext

  @Autowired
  MockMvc mockMvc

  // if any service to mock
  @SpringBean
  MyService myService

  def "Root returns 200 - OK"(){

      when:
      response = mockMvc.perform(get("/"))

      then:
      response.andExpect(status().isOk())
  }
}

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

@SpringBootTest(webEnvironment = RANDOM_PORT)
@ActiveProfiles("integration-test")

class FirstSpec extends Specification{
  @Autowired
  WebApplicationContext webApplicationContext

  @Autowired
  MockMvc mockMvc

  // if any service to mock
  @SpringBean
  MyService myService

  def "Root returns 200 - OK"(){

      when:
      response = mockMvc.perform(get("/"))

      then:
      response.andExpect(status().isOk())
  }
}
person Vincent Couturier    schedule 29.06.2018
comment
Винсент, хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, которые представляют собой не более чем ссылку, могут быть удалены. - person Shree; 29.06.2018
comment
Я добавил более подробную информацию о своем ответе, спасибо за ваш отзыв - person Vincent Couturier; 29.06.2018