java单元测试:如何在读取代码中传递模拟类
我在我的项目中使用hazelcast,我想对一些功能进行单元测试,但我不想让它连接到真正的hazelcast并对其执行测试,因为我创建了一个自定义的模拟类,它只使用scala映射,因为在hazelcast映射中也有 这是我的密码
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
和UserUtil
类的getUser
这样做:
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
# 1 楼答案
嗯:你的utils课程说:
因此它需要一个UserRepo的实例
但是您正在传递一个UserRepoMock的实例。UserRepoMock是UserRepository,就像UserRepo一样;但是UserRepoMock不是UserRepo
也许这就像将utils更改为
表示不希望指定特定的类。相反,你只需说:任何具有特质的都可以
除此之外,真正的答案可能是:看看你的命名习惯。你看,这两个名字UserRepositor和UserRepo;他们彼此非常“接近”;而且这两者之间的区别一点也不清楚。如果名称更加清晰,比如UserRepositoryTrait和HCastUserRepository,那么您可能一开始就不会犯这个错误(根据scala惯例,我不确定我的建议是否是“好”名称;但它们只是想给您一个想法)