在另一个服务类 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 中模拟具有依赖关系的服务类的主要内容,如果未能解决你的问题,请参考以下文章

Mockito无法在SpringBoot中模拟接口类

如何使用 mockito 模拟方法?

Mockito不能依赖于Unmarshaller来模拟类[重复]

SpringBoot 单元测试利器——Mockito

Mockito单元测试

Mockito 简明教程