thomi
thomi

Reputation: 1697

WebApplicationContext does not Autowire when injecting in Spock Specification

Although I followed the Spring Boot Guide, when trying:

@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())
  }
}

I just get the message that a WebApplicationContext just is not injected. I do have

    <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>

In my .pom, also, just as the guide advises, yet still no success. Anything I am missing? I need the app context so all the beans are injected. Any ideas?

Upvotes: 5

Views: 1923

Answers (2)

Vincent Couturier
Vincent Couturier

Reputation: 526

You could also use SpringBean annotation available in Spock 1.2: https://objectpartners.com/2018/06/14/spock-1-2-annotations-for-spring-integration-testing/

it could be easier with this :

@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())
  }
}

If you don't want to mock your services you can use directly @SpringBootTest which does the same job with only one annotation

@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())
  }
}

Upvotes: 0

Deepak Sarda
Deepak Sarda

Reputation: 1068

Can you try moving the mockMvc construction to the setup method?

def setup() {
    mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build()
}

Upvotes: 2

Related Questions