【问题标题】:Mock a Service class with dependencies in another Service Class Mockito在另一个服务类 Mockito 中模拟具有依赖关系的服务类
【发布时间】:2019-04-15 22:14:45
【问题描述】:

我想在另一个服务类 Mockito 中模拟一个具有依赖关系的服务类。

用户服务类

@Service
class UserService(
    val userRepository: UserRepository,
    val userRoleRepository: UserRoleRepository,
    val jwtGenerator: JwtGenerator,
    val emailService: EmailService
)

AdminService 类

@Service
class AdminService(
    val userService: UserService,
    val userRepository: UserRepository,
    val adminRepository: AdminRepository
)

现在我正在尝试使用这些类编写单元测试,如下所示

@RunWith(MockitoJUnitRunner::class)
class AdminServiceTests {

private lateinit var createAdmin: CreateAdmin

@Mock
lateinit var userRepository: UserRepository

@Mock
lateinit var userRoleRepository: UserRoleRepository

@Mock
lateinit var jwtGenerator: JwtGenerator

@Mock
lateinit var emailService: EmailService

@InjectMocks
lateinit var userService: UserService

@Mock
lateinit var userRepository: UserRepository // Conflicting declarations

@Mock
lateinit var adminRepository: AdminRepository

@InjectMocks
lateinit var adminService: AdminService

@Before
fun setup() {
    this.createAdmin = CreateAdmin().apply {
        email = "admin@gmail.com"
        name = "admin"
        password = "qwerty"
        phone = 9873555555555
    }
}

@Test
fun testCreateAdmin() {
    val result = adminService.createAdmin(createAdmin)
    Assert.assertEquals(true, result)
}
}

请建议如何在 AdminService 中模拟 userService 并注入所有四个依赖项

【问题讨论】:

    标签: spring-boot kotlin mockito


    【解决方案1】:

    您可以创建 UserService 对象及其依赖项作为模拟对象,然后将其用作 AdminServiceTests 中的依赖项。

    【讨论】:

    • krishna Murari 但两种服务都将 userRepository 作为共同依赖项
    • 我已按照您的建议编辑了问题,请查看并告诉您要更改的内容
    • @Mohanraj 您只创建模拟对象 Mock - UserRepository 、 UserRoleRepository 、JwtGenerator 、 EmailService 、AdminRepository 创建上述所需模拟对象的 UserService 对象并不重要。然后使用 UserService 和 UserRepository 的对象创建 AdminService 的对象,AdminRepository 作为模拟对象我建议创建一个 StorageService 并将所有存储库放入其中会是一个更好的设计。
    • 我的建议是创建一个简单的 UserService 对象,并将其所需的依赖项作为模拟对象。然后使用 UserService 对象和其他依赖项作为模拟对象创建 AdminService 对象。你可以google一下怎么做。我不熟悉 kotlin 。我用 groovy 和 spock 编写测试。
    【解决方案2】:

    如果您使用 Gradle 和 Spring,请将此插件添加到您的 build.gradle

    plugins {
        kotlin("plugin.spring") version "1.3.72"
    }
    

    Mockito 应该可以工作,而不必模拟服务的依赖项:

    val userService = Mockito.mock(UserService::class.java)
    

    【讨论】:

      猜你喜欢
      • 2019-12-08
      • 1970-01-01
      • 1970-01-01
      • 2021-09-11
      • 1970-01-01
      • 2018-10-15
      • 2018-08-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多