2017-05-06 55 views
1

我在我的項目中使用hazelcast,我想單元測試一些功能,但我不希望它連接到真正的榛子,並執行測試它爲我創建簡單的使用Scala的地圖,因爲在這裏hazelcast地圖也有 定製的模擬類是我的代碼UnitTesting:如何通過我的模擬類在閱讀代碼

trait UserRepository { 
    def getUserObj(id: String):Option[User] 
    def addToUserRepo(user: User) 
} 

class UserRepo extends UserRepository{ 
    def getUserObj(id: String):Option[User] = { 
    val userMap = hcastClient.getMap[String, User]("UserMap") 
    val userObj = userMap.get(id) 
    Option(userObj) 
    } 
def addToUserRepo(user: User) = { 
    val directUserMap: IMap[String, User] = hcastClient.getMap[String,User]("UserMap") 
    directUserMap.set(user.uuid, user) 
    } 

,並在這裏,我創建了一個簡單的定製版本嘲笑所在班級的功能是相同的只是, Scala的地圖取代了它:

class UserRepoMock extends UserRepository { 
    val map:Map[String,User]=Map[String,User]() 
    def getUserMap:Map[String,User] = { 
    map 
    } 

    def getUserObj(id: String):User = { 
    val userMap = getUserMap 
    val userObj = userMap.get(id) 
    userObj 
    } 
    def addToUserRepo(user: User) = { 
    val userMap = getUserMap 
    userMap.put(user.uuid, user) 
    } 

class UserUtil(userRepo:UserRepo) { 
def addUser(user:User):Boolean={ 
try{ 
    userRepo.addToUserRepo(user) 
    true 
} 
catch { 
case e:Exception=>false 
} 
def getUser(id:String):User={ 
    val user=userRepo.getUserObj(id) 
    user 
} 

慕我想單元測試方法addUser,並通過做這樣getUserUserUtil

class UserUtilTest extends funSpec { 
    val userUtil=new UserUtil(new UserRepoMock) 
     userUtil.addUser //perform unit test on it 
     userUtil.getUser //perform unit test on it 
     // instead of doing this val userUtil=new UserUtil(new UserRepo) 
} 

但是編譯器不允許我這樣做,有什麼我丟失,請幫我我如何實現所需的功能

這是編譯器錯誤:

type mismatch; found : testhcastrepo.UserRepoMock required: com.repositories.UserRepo 
+0

尋求調試幫助的問題(「爲什麼這個代碼不工作?」)必須包含所需的行爲,特定的問題或錯誤以及在問題本身中重現問題所需的最短代碼。沒有明確問題陳述的問題對其他讀者無益。請參閱:如何創建[mcve] ...提示:錯誤消息! – GhostCat

+0

編輯了我提到的錯誤的問題,請檢查 – swaheed

回答

0

好:你的utils的班說:

class UserUtil(userRepo:UserRepo) 

所以它需要的UserRepo一個實例。

但是,然後你通過UserRepoMock的實例。 UserRepoMock是UserRepository,與UserRepo一樣;但UserRepoMock 不是一個UserRepo!

也許這是爲改變utils的以

class UserUtil(userRepo:UserRepository) 

以表明您不希望指定特定類一樣簡單。相反,你只需說:任何具有性狀將做!

超越的是:真正的答案可能是:看看你的命名習慣。你看,這兩個名字UserRepositorUserRepo;他們相互「親密」;而且這個根本沒有清楚,兩者有什麼區別。如果名稱更清晰,比如UserRepositoryTraitHCastUserRepository您可能不會首先犯這個錯誤(不確定我的建議是否符合Scala慣例的「好」名稱;但它們只是爲了給你是個想法)。

+0

非常感謝你非常基本的東西,我失蹤 – swaheed

+0

非常感謝我會遵循這種方法 – swaheed