加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

单元测试 – 如何使用蛋糕模式进行模拟

发布时间:2020-12-16 19:20:53 所属栏目:安全 来源:网络整理
导读:我有以下课程: class LinkUserService() { //** cake pattern ** oauthProvider: OAuthProvider = //****************** def isUserLinked(userId: String,service: String) = { val cred = oauthProvider.loadCredential(userId) cred != null } def linkU
我有以下课程:

class LinkUserService() {

  //** cake pattern **
  oauthProvider: OAuthProvider =>
  //******************

  def isUserLinked(userId: String,service: String) = {
    val cred = oauthProvider.loadCredential(userId)
    cred != null

  }

  def linkUserAccount(userId: String,service: String): (String,Option[String]) = {
    if (isUserLinked(userId,service)) {
      ("SERVICE_LINKED",None)
    } else {
      val authUrl = oauthProvider.newAuthorizationUrl
      ("SERVICE_NOT_LINKED",Some(authUrl))
    }
  }

  def setLinkAuthToken(userId: String,service:String,token:String):String = {
    oauthProvider.createAndStoreCredential(userId,token)
  }

}

通常我会在生产中使用这个类,如下所示:

val linkService =使用GoogleOAuthProvider的LinkUserService

当涉及到测试时,我想用模拟替换oauthProvider,这样我的单元测试就会对它进行响应,如下所示:oauthProvider.loadCredential(“nobody”)返回null.这可能吗?如果是这样,我将如何设置我的单元测试呢?

解决方法

你有这个问题,因为你没有完全使用蛋糕模式.如果你写的东西像

trait LinkUserServiceComponent {
    this: OAuthProviderComponent =>

    val linkUserService = new LinkUserService

    class LinkUserService {
        // use oauthProvider explicitly
        ...
    }
}

trait GoogleOAuthProviderComponent {
    val oauthProvider = new GoogleOAuthProvider

    class GoogleOAuthProvider {
        ...
    }
}

然后你使用这样的模拟:

val combinedComponent = new LinkUserServiceComponent with OAuthProviderComponent {
    override val oauthProvider = mock(...)
}

然后你的问题消失了.如果你也像这样制作通用接口特性(并使其他组件依赖于接口,而不是实现):

trait OAuthProviderComponent {
    def oauthProvider: OAuthProvider

    trait OAuthProvider {
        // Interface declaration
    }
}

那么你也会有通用的可重用和可测试的代码.

这与你的建议非常相似,它确实是蛋糕模式的本质.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读