devasthali-os / scalatest-springboot

scalatest for springboot endpoints
2 stars 0 forks source link

can not inject webappcontext #1

Open prayagupa opened 6 years ago

prayagupa commented 6 years ago

test1

import somepackage.SomeConfig
import somepackage.util.HttpTestContextManager
import org.scalatest.{BeforeAndAfterAll, FunSuite, GivenWhenThen, Matchers}
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.test.context.web.WebAppConfiguration
import org.springframework.test.context.{ContextConfiguration, TestContextManager}
import org.springframework.test.web.servlet.MockMvc
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders
import org.springframework.test.web.servlet.result.MockMvcResultHandlers
import org.springframework.test.web.servlet.setup.MockMvcBuilders
import org.springframework.web.context.WebApplicationContext

@ContextConfiguration(classes = Array(classOf[SomeConfig]))
@WebAppConfiguration
class MusicEndpointComponentSpec extends FunSuite with HttpTestContextManager with Matchers with GivenWhenThen with BeforeAndAfterAll {

  @Autowired
  val webApplicationContext: WebApplicationContext = null

  var endpoint: MockMvc = null

  override protected def beforeAll(): Unit = {
    endpoint = MockMvcBuilders.webAppContextSetup(webApplicationContext).build()
  }

  test("accepts order-status request and responds with order-status response") {

    val response = endpoint.perform(MockMvcRequestBuilders.post("/api/music")
      .content("{}")).andDo(MockMvcResultHandlers.print())

    1 shouldBe 1
  }

}

test2

import somepackage.SomeConfig
import org.scalatest.{BeforeAndAfterAll, FunSuite, GivenWhenThen, Matchers}
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.test.context.web.WebAppConfiguration
import org.springframework.test.context.{ContextConfiguration, TestContextManager}
import org.springframework.test.web.servlet.MockMvc
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders
import org.springframework.test.web.servlet.result.MockMvcResultHandlers
import org.springframework.test.web.servlet.setup.MockMvcBuilders
import org.springframework.web.context.WebApplicationContext

@ContextConfiguration(classes = Array(classOf[SomeConfig]))
@WebAppConfiguration
class MusicEndpointComponentSpec extends FunSuite with Matchers with GivenWhenThen with BeforeAndAfterAll {

  new TestContextManager(this.getClass()).prepareTestInstance(this)

  @Autowired
  val webApplicationContext: WebApplicationContext = null

  var endpoint: MockMvc = null

  override protected def beforeAll(): Unit = {
    endpoint = MockMvcBuilders.webAppContextSetup(webApplicationContext).build()
  }

  test("accepts order-status request and responds with order-status response") {

    val response = endpoint.perform(MockMvcRequestBuilders.post("/api/order/status")
      .content("{}")).andDo(MockMvcResultHandlers.print())

    1 shouldBe 1
  }

}

error

Exception encountered when invoking run on a nested suite - WebApplicationContext is required
java.lang.IllegalArgumentException: WebApplicationContext is required
    at org.springframework.util.Assert.notNull(Assert.java:134)
    at org.springframework.test.web.servlet.setup.DefaultMockMvcBuilder.<init>(DefaultMockMvcBuilder.java:52)
    at org.springframework.test.web.servlet.setup.MockMvcBuilders.webAppContextSetup(MockMvcBuilders.java:47)
    at somepackage.MusicControllerComponentSpec.beforeAll(OrderStatusControllerComponentSpec.scala:28)
    at org.scalatest.BeforeAndAfterAll.liftedTree1$1(BeforeAndAfterAll.scala:212)
    at org.scalatest.BeforeAndAfterAll.run(BeforeAndAfterAll.scala:210)
    at org.scalatest.BeforeAndAfterAll.run$(BeforeAndAfterAll.scala:208)
    at somepackage.MusicControllerComponentSpec.run(OrderStatusControllerComponentSpec.scala:18)
    at org.scalatest.tools.SuiteRunner.run(SuiteRunner.scala:45)
    at org.scalatest.tools.Runner$.$anonfun$doRunRunRunDaDoRunRun$13(Runner.scala:1340)
    at org.scalatest.tools.Runner$.$anonfun$doRunRunRunDaDoRunRun$13$adapted(Runner.scala:1334)
    at scala.collection.immutable.List.foreach(List.scala:389)
    at org.scalatest.tools.Runner$.doRunRunRunDaDoRunRun(Runner.scala:1334)
    at org.scalatest.tools.Runner$.$anonfun$runOptionallyWithPassFailReporter$24(Runner.scala:1031)
    at org.scalatest.tools.Runner$.$anonfun$runOptionallyWithPassFailReporter$24$adapted(Runner.scala:1010)
    at org.scalatest.tools.Runner$.withClassLoaderAndDispatchReporter(Runner.scala:1500)
    at org.scalatest.tools.Runner$.runOptionallyWithPassFailReporter(Runner.scala:1010)
    at org.scalatest.tools.Runner$.run(Runner.scala:850)
    at org.scalatest.tools.Runner.run(Runner.scala)
    at org.jetbrains.plugins.scala.testingSupport.scalaTest.ScalaTestRunner.runScalaTest2(ScalaTestRunner.java:138)
    at org.jetbrains.plugins.scala.testingSupport.scalaTest.ScalaTestRunner.main(ScalaTestRunner.java:28)

what works is

import somepackage.SomeConfig
import org.scalatest.{BeforeAndAfterAll, FunSuite, GivenWhenThen, Matchers}
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.test.context.web.WebAppConfiguration
import org.springframework.test.context.{ContextConfiguration, TestContextManager}
import org.springframework.test.web.servlet.MockMvc
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders
import org.springframework.test.web.servlet.result.MockMvcResultHandlers
import org.springframework.test.web.servlet.setup.MockMvcBuilders
import org.springframework.web.context.WebApplicationContext

@ContextConfiguration(classes = Array(classOf[SomeConfig]))
@WebAppConfiguration
class MusicEndpointComponentSpec extends FunSuite with Matchers with GivenWhenThen with BeforeAndAfterAll {

  @Autowired
  val webApplicationContext: WebApplicationContext = null

  var endpoint: MockMvc = null

  new TestContextManager(this.getClass()).prepareTestInstance(this)

  override protected def beforeAll(): Unit = {
    endpoint = MockMvcBuilders.webAppContextSetup(webApplicationContext).build()
  }

  test("accepts order-status request and responds with order-status response") {

    val response = endpoint.perform(MockMvcRequestBuilders.post("/api/music")
      .content("{}")).andDo(MockMvcResultHandlers.print())

    1 shouldBe 1
  }

}
prayagupa commented 6 years ago

Trick is do to call beforeAll of HttpTestContextManager first.

import somepackage.SomeConfig
import org.scalatest.{BeforeAndAfterAll, FunSuite, GivenWhenThen, Matchers}
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.test.context.web.WebAppConfiguration
import org.springframework.test.context.{ContextConfiguration, TestContextManager}
import org.springframework.test.web.servlet.MockMvc
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders
import org.springframework.test.web.servlet.result.MockMvcResultHandlers
import org.springframework.test.web.servlet.setup.MockMvcBuilders
import org.springframework.web.context.WebApplicationContext

@ContextConfiguration(classes = Array(classOf[SomeConfig]))
@WebAppConfiguration
class MusicEndpointComponentSpec extends FunSuite with Matchers with GivenWhenThen with BeforeAndAfterAll {

  @Autowired
  val webApplicationContext: WebApplicationContext = null

  var endpoint: MockMvc = null

  new TestContextManager(this.getClass()).prepareTestInstance(this)

  override protected def beforeAll(): Unit = {
    super.beforeAll()
    endpoint = MockMvcBuilders.webAppContextSetup(webApplicationContext).build()
  }

  test("accepts order-status request and responds with order-status response") {

    val response = endpoint.perform(MockMvcRequestBuilders.post("/api/music")
      .content("{}")).andDo(MockMvcResultHandlers.print())

    response.andExpect(MockMvcResultMatchers.status().is(200))
  }

}