有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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
}

我想要单元测试方法addUserUserUtil类的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) 个答案

  1. # 1 楼答案

    嗯:你的utils课程说:

    class UserUtil(userRepo:UserRepo)
    

    因此它需要一个UserRepo的实例

    但是您正在传递一个UserRepoMock的实例。UserRepoMock是UserRepository,就像UserRepo一样;但是UserRepoMock不是UserRepo

    也许这就像将utils更改为

    class UserUtil(userRepo:UserRepository)
    

    表示不希望指定特定的类。相反,你只需说:任何具有特质的都可以

    除此之外,真正的答案可能是:看看你的命名习惯。你看,这两个名字UserRepositorUserRepo;他们彼此非常“接近”;而且这两者之间的区别一点也不清楚。如果名称更加清晰,比如UserRepositoryTraitHCastUserRepository,那么您可能一开始就不会犯这个错误(根据scala惯例,我不确定我的建议是否是“好”名称;但它们只是想给您一个想法)