sping单元测试的运行速度怎么提升? 每次都重新初始化一次context太慢了

即便了很简单的几行代码, 如果用了spring给你注入的类就得把 spring 重新初始化一次, 全世界的开发者都是这样的吗?
我是macbook pro15寸, 配置很高, 每次耽误15秒才能看到运行结果, 那么一年下来耽误的实际可以绕地球一圈? 全世界的开发者可以绕宇宙一圈?

阅读 15.6k
1 个回答

如果你写Scala的话可以参考我写的文章:https://github.com/sadhen/12-...

在这里摘录如下。我的解决方案是使用ScalaMock,如果是Java,可以使用mockito。

有依赖注入的类怎么测试

很简单:

@RunWith(classOf[SpringRunner])
@SpringBootTest
class SampleTest {
  @Autowired
  var sampleService: SampleService = _
  
  def testSampleService = ???
}

下面这个例子演示了如何测试Rest Controller,其实也很简单,主要是利用了spring-boot-starter-test里面提供的TestRestTemplate。其中有些json4s的语法或许你没有接触过,且看下文。

@RunWith(classOf[SpringRunner])
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
class HelloControllerTest {
  @Autowired
  var restTemplate: TestRestTemplate = _

  @Test
  def testHello(): Unit = {
    val body = restTemplate.getForObject("/api/hello", classOf[JsonNode])
    val expected = ("code" -> 0) ~
      ("data" -> ("hello" -> "中国") ~ ("year" -> 2017)) ~
      ("error" -> JNull)
    assert {
      fromJsonNode(body) == expected
    }
  }
}

但是这种测试有个弊端,由于需要初始化上下文,每次都需要等上好长一段时间。

ScalaMock

ScalaMock就是用来解决上文提到的问题的。看代码:

class HelloControllerSpec extends FlatSpec with Matchers with MockFactory {

  "/api/hello" should "be ok" in {
    val worldService = stub[WorldService]
    (worldService.getCountry _).when().returns("法国")

    val helloController = new HelloController(worldService)

    val expected = ("code" -> 0) ~
      ("data" -> ("hello" -> "法国") ~ ("year" -> 2017)) ~
      ("error" -> JNull)

    assert {
      fromJsonNode(helloController.hello) == expected
    }
  }
}

这个例子中,我们mock了一个WorldService,通过指定getCountry方法的返回值定义了worldService的行为模式。从而不需要初始化上下文就可以完成Rest Controller的测试。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题