import io.mockk.*
import org.junit.jupiter.api.Test
import kotlin.test.assertEquals
class OrderServiceIntegrationTest {
@Test
fun `test placeOrder with valid user and payment`() {
// 模拟依赖
val userService = mockk<UserService>()
val paymentService = mockk<PaymentService>()
val orderService = OrderService(userService, paymentService)
// 模拟方法调用结果
every { userService.checkUser() } returns true
every { paymentService.processPayment() } returns true
// 执行方法
val result = orderService.placeOrder()
// 验证结果
assertEquals(true, result)
// 验证依赖方法调用
verify { userService.checkUser() }
verify { paymentService.processPayment() }
}
@Test
fun `test placeOrder with invalid user`() {
val userService = mockk<UserService>()
val paymentService = mockk<PaymentService>()
val orderService = OrderService(userService, paymentService)
every { userService.checkUser() } returns false
val result = orderService.placeOrder()
assertEquals(false, result)
verify { userService.checkUser() }
// 因为用户校验失败,不应调用支付服务
verify(exactly = 0) { paymentService.processPayment() }
}
@Test
fun `test placeOrder with valid user but payment failure`() {
val userService = mockk<UserService>()
val paymentService = mockk<PaymentService>()
val orderService = OrderService(userService, paymentService)
every { userService.checkUser() } returns true
every { paymentService.processPayment() } returns false
val result = orderService.placeOrder()
assertEquals(false, result)
verify { userService.checkUser() }
verify { paymentService.processPayment() }
}
@Test
fun `test placeOrder with user service exception`() {
val userService = mockk<UserService>()
val paymentService = mockk<PaymentService>()
val orderService = OrderService(userService, paymentService)
every { userService.checkUser() } throws RuntimeException("User service error")
try {
orderService.placeOrder()
} catch (e: RuntimeException) {
assertEquals("User service error", e.message)
}
verify { userService.checkUser() }
// 因为用户服务异常,不应调用支付服务
verify(exactly = 0) { paymentService.processPayment() }
}
@Test
fun `test placeOrder with payment service exception`() {
val userService = mockk<UserService>()
val paymentService = mockk<PaymentService>()
val orderService = OrderService(userService, paymentService)
every { userService.checkUser() } returns true
every { paymentService.processPayment() } throws RuntimeException("Payment service error")
try {
orderService.placeOrder()
} catch (e: RuntimeException) {
assertEquals("Payment service error", e.message)
}
verify { userService.checkUser() }
verify { paymentService.processPayment() }
}
}
class OrderService(private val userService: UserService, private val paymentService: PaymentService) {
fun placeOrder(): Boolean {
try {
if (!userService.checkUser()) {
return false
}
return paymentService.processPayment()
} catch (e: Exception) {
// 处理异常
return false
}
}
}
interface UserService {
fun checkUser(): Boolean
}
interface PaymentService {
fun processPayment(): Boolean
}