增加 transaction service init 测试
diff --git a/payapi/src/test/kotlin/com/supwisdom/dlpay/transaction_service_test.kt b/payapi/src/test/kotlin/com/supwisdom/dlpay/transaction_service_test.kt
new file mode 100644
index 0000000..cfacc16
--- /dev/null
+++ b/payapi/src/test/kotlin/com/supwisdom/dlpay/transaction_service_test.kt
@@ -0,0 +1,131 @@
+package com.supwisdom.dlpay
+
+import com.supwisdom.dlpay.api.TransactionBuilder
+import com.supwisdom.dlpay.api.dao.TransactionMainDao
+import com.supwisdom.dlpay.api.domain.TAccount
+import com.supwisdom.dlpay.api.domain.TSourceType
+import com.supwisdom.dlpay.api.domain.TTransactionMain
+import com.supwisdom.dlpay.api.repositories.AccountService
+import com.supwisdom.dlpay.api.service.AccountUtilServcie
+import com.supwisdom.dlpay.api.service.SourceTypeService
+import com.supwisdom.dlpay.api.service.TransactionService
+import com.supwisdom.dlpay.api.service.impl.TransactionServiceImpl
+import com.supwisdom.dlpay.framework.data.SystemDateTime
+import com.supwisdom.dlpay.framework.domain.TShopacc
+import com.supwisdom.dlpay.framework.service.SystemUtilService
+import com.supwisdom.dlpay.framework.util.Subject
+import com.supwisdom.dlpay.framework.util.TradeCode
+import com.supwisdom.dlpay.framework.util.TradeDict
+import io.mockk.MockKAnnotations
+import io.mockk.every
+import io.mockk.impl.annotations.InjectMockKs
+import io.mockk.impl.annotations.MockK
+import io.mockk.junit5.MockKExtension
+import io.mockk.mockk
+import io.mockk.verify
+import org.hamcrest.CoreMatchers.notNullValue
+import org.hamcrest.MatcherAssert.assertThat
+import org.hamcrest.Matchers.equalTo
+import org.junit.jupiter.api.Test
+import org.junit.jupiter.api.extension.ExtendWith
+import java.sql.Timestamp
+import java.util.*
+
+@ExtendWith(MockKExtension::class)
+class TransactionServcieTest {
+    companion object {
+        const val OutId = "1000"
+        const val OutTransNo = "12"
+        const val OperatorID = "3454"
+        const val OperatorType = "operator"
+        const val Refno = "20191216103421000001"
+        const val Accdate = "20191216"
+    }
+
+    @InjectMockKs
+    var transactionService: TransactionService = TransactionServiceImpl()
+
+    @MockK
+    private lateinit var transactionMainDao: TransactionMainDao
+
+    @MockK
+    private lateinit var accountService: AccountService
+
+    @MockK
+    private lateinit var accountUtilService: AccountUtilServcie
+
+    @MockK
+    private lateinit var systemUtilService: SystemUtilService
+
+    @MockK
+    private lateinit var sourceTypeService: SourceTypeService
+
+
+    init {
+        MockKAnnotations.init(this)
+    }
+
+    private fun testAccount(): TAccount {
+        return TAccount().apply {
+            accno = "1200203303"
+            accname = "test"
+            transStatus = TradeDict.STATUS_NORMAL
+        }
+    }
+
+    private fun testShop(): TShopacc {
+        return TShopacc().apply {
+            shopaccno = "4001"
+            shopid = 1
+            shopname = "test shop"
+            status = TradeDict.STATUS_NORMAL
+        }
+    }
+
+    @Test
+    fun testTransaction() {
+        val builder = TransactionBuilder()
+        val person = testAccount()
+        val shop = testShop()
+        val amount = 1600
+        builder.apply {
+            setTransInfo("20191205", "134521", TradeCode.TRANSCODE_CARD_BIZ, "balance")
+            setOutTransInfo(OutId, OutTransNo)
+            operator(OperatorID, OperatorType)
+            dtltype = "restaurant"
+        }.person(person).apply {
+            setOpposite(shop.shopaccno, shop.shopname)
+            setAmount(amount / 100.0, TradeDict.TRADE_FLAG_OUT)
+        }.and().shop(shop).apply {
+            setOpposite(person.accno, person.accname)
+            setAmount(amount / 100.0, TradeDict.TRADE_FLAG_IN)
+        }.and()
+                .addDebitCreditRecord(person.accno, Subject.SUBJNO_PERSONAL_DEPOSIT,
+                        shop.shopaccno, Subject.SUBJNO_MACHANT_INCOME,
+                        amount / 100.0, "消费")
+
+        every { systemUtilService.refno } returns Refno
+        every { systemUtilService.accdate } returns Accdate
+        every { sourceTypeService.getBySourceType(builder.sourceType) } returns TSourceType().apply {
+            sourceType = "balance"
+            checkable = false
+        }
+        every { systemUtilService.sysdatetime } returns mockk {
+            every { hostdate } returns "20191216"
+            every { hosttime } returns "131725"
+            every { hostdatetime } returns "20191216131725"
+            every { sysdate } returns Timestamp(System.currentTimeMillis())
+        }
+
+        every { transactionMainDao.save(any<TTransactionMain>()) } answers {
+            arg(0)
+        }
+
+        val transaction = transactionService.init(builder)
+        assertThat(transaction.refno, equalTo(Refno))
+        assertThat(transaction.accdate, equalTo(Accdate))
+        verify(exactly = 1) { systemUtilService.refno }
+        verify(atLeast = 1) { systemUtilService.accdate }
+        verify(exactly = 1) { sourceTypeService.getBySourceType(builder.sourceType) }
+    }
+}
\ No newline at end of file