单元测试 – 如何使用蛋糕模式进行模拟
发布时间: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 } } 那么你也会有通用的可重用和可测试的代码. 这与你的建议非常相似,它确实是蛋糕模式的本质. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |