在另一个服务类 Mockito 中模拟具有依赖关系的服务类
Posted
技术标签:
【中文标题】在另一个服务类 Mockito 中模拟具有依赖关系的服务类【英文标题】:Mock a Service class with dependencies in another Service Class 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 并注入所有四个依赖项
【问题讨论】:
【参考方案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)
【讨论】:
以上是关于在另一个服务类 Mockito 中模拟具有依赖关系的服务类的主要内容,如果未能解决你的问题,请参考以下文章