【问题标题】:Call a function from Test class not working Mockito从测试类调用一个函数不起作用 Mockito
【发布时间】:2019-04-15 04:30:02
【问题描述】:

您好,我有一个名为 UserServiceTest 的测试类,其中包含注入上述模拟的 userService 类,并且该测试类中的测试工作正常。

@RunWith(MockitoJUnitRunner::class)
class UserServiceTest {

lateinit var login: Login

@Mock
lateinit var userRepository: UserRepository

@Mock
lateinit var emailService: EmailService

@InjectMocks
lateinit var userService: UserService

@Before
fun setup() {
    login = Login(email = "mohanraj@gmail.com", password = "qwerty"
}

我还有另一个名为 AdminServiceTests 的测试类,其中包含注入上述模拟的 AdminServiceClass,该模拟还包含 userService 类

@RunWith(MockitoJUnitRunner::class)
class AdminServiceTests {

lateinit var user: User

@Mock
lateinit var userRepository: UserRepository

@Mock
lateinit var adminRepository: AdminRepository

@Mock
lateinit var userService: UserService

@InjectMocks
lateinit var adminService: AdminService

@Before
fun setup() {

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

@Test
fun testCreateAdmin() {

    val result = adminService.createAdmin(createAdmin)
    Assert.assertEquals(true, result)
}

当我运行测试时,adminService.createAdmin(createAdmin) 调用了 adminService 中的一个函数,该函数调用了 userService 中的一个函数

fun createAdmin(newUser: CreateAdmin): Boolean {
    val user = userService.getUser(newUser)

    if (userService.createUser(user)) { // calls a function in user service
        this.saveAdmin(user.id)

        return true
    }

    return false
}

我想从 testCreateAdmin 函数中调用 userService 中的一个函数,但是我作为 @Mock 包含的用户服务本身包含一些依赖项,它是 adminService 的依赖项,所以当我调试 @Mock userService 对象时包含 null因此不会调用 userService 中的函数。那么如何将依赖项注入userService并将其注入adminService..请帮助

userService = {UserService$MockitoMock$825690330@2479}
mockitoInterceptor = {MockMethodInterceptor@2532} 
userRepository = null
emailService = null

【问题讨论】:

  • UserService 在你的AdminServiceTests 中被模拟,所以它的原始行为被替换为你配置的任何东西(当这个然后那个),或者如果你做了默认行为不指定任何内容,在您的情况下userService.createUser(user) 将返回默认布尔值false。所以是的,原始方法不在模拟中调用是正常的,除非you actually specify that,如果这实际上是你真正想要的。

标签: spring-boot kotlin mockito


【解决方案1】:

在您的testCreateAdmin() 中,您必须模拟userService 方法的行为。默认情况下,非模拟方法将返回null

它应该看起来像这样,使用 mockito-kotlin。

@Test
fun testCreateAdmin() {
  val admin = mock<User>() {
    on { id } doReturn "id"
  }
  whenever(userService.getUser(createAdmin)).doReturn(admin)
  whenever(userService.createUser(admin)).doReturn(true)

  val result = adminService.createAdmin(createAdmin)

  Assert.assertEquals(true, result)
  verify(userService).saveAdmin("id")
}

【讨论】:

  • 非常感谢...请帮助我更新问题
猜你喜欢
  • 2019-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-05
  • 2014-03-30
  • 1970-01-01
  • 2021-04-02
  • 1970-01-01
相关资源
最近更新 更多