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

发布于 2022-09-04 17:50:23 字数 151 浏览 38 评论 0

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

彼岸花ソ最美的依靠 2022-09-11 17:50:23

如果你写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的测试。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文