Mysql Kotlin测试未能验证连接,最终失败,表不存在
得到以下错误,当我运行我的测试时,这是一个Kotlin项目,我正在重新运行我的测试的嵌入式版本Mysql Kotlin测试未能验证连接,最终失败,表不存在,mysql,spring-boot,kotlin,spring-data-jpa,liquibase,Mysql,Spring Boot,Kotlin,Spring Data Jpa,Liquibase,得到以下错误,当我运行我的测试时,这是一个Kotlin项目,我正在重新运行我的测试的嵌入式版本Mariadb,当我从IntelliJ中运行独立测试时,此错误不存在。 看起来可能是表创建的超时问题。日志中提到的这个表是在其他各种测试中创建的 [INFO] Running com.netapp.qronicle.jobs.ReportJobManagerTransactionalIT 2019-05-20 17:31:50.049 WARN 45164 --- [ main]
Mariadb
,当我从IntelliJ
中运行独立测试时,此错误不存在。
看起来可能是表创建的超时问题。日志中提到的这个表是在其他各种测试中创建的
[INFO] Running com.netapp.qronicle.jobs.ReportJobManagerTransactionalIT
2019-05-20 17:31:50.049 WARN 45164 --- [ main] com.zaxxer.hikari.pool.PoolBase : HikariPool-84 - Failed to validate connection org.mariadb.jdbc.MariaDbConnection@678c1c13 (Connection.setNetworkTimeout cannot be called on a closed connection). Possibly consider using a shorter maxLifetime value.
2019-05-20 17:31:50.055 WARN 45164 --- [ main] com.zaxxer.hikari.pool.PoolBase : HikariPool-84 - Failed to validate connection org.mariadb.jdbc.MariaDbConnection@4c8a0916 (Connection.setNetworkTimeout cannot be called on a closed connection). Possibly consider using a shorter maxLifetime value.
2019-05-20 17:31:50.056 WARN 45164 --- [ main] com.zaxxer.hikari.pool.PoolBase : HikariPool-84 - Failed to validate connection org.mariadb.jdbc.MariaDbConnection@3d189ad8 (Connection.setNetworkTimeout cannot be called on a closed connection). Possibly consider using a shorter maxLifetime value.
2019-05-20 17:31:50.057 WARN 45164 --- [ main] com.zaxxer.hikari.pool.PoolBase : HikariPool-84 - Failed to validate connection org.mariadb.jdbc.MariaDbConnection@110ff601 (Connection.setNetworkTimeout cannot be called on a closed connection). Possibly consider using a shorter maxLifetime value.
2019-05-20 17:31:50.060 WARN 45164 --- [ main] com.zaxxer.hikari.pool.PoolBase : HikariPool-84 - Failed to validate connection org.mariadb.jdbc.MariaDbConnection@2cdda367 (Connection.setNetworkTimeout cannot be called on a closed connection). Possibly consider using a shorter maxLifetime value.
2019-05-20 17:31:50.061 WARN 45164 --- [ main] com.zaxxer.hikari.pool.PoolBase : HikariPool-84 - Failed to validate connection org.mariadb.jdbc.MariaDbConnection@43bcef96 (Connection.setNetworkTimeout cannot be called on a closed connection). Possibly consider using a shorter maxLifetime value.
2019-05-20 17:31:50.063 WARN 45164 --- [ main] com.zaxxer.hikari.pool.PoolBase : HikariPool-84 - Failed to validate connection org.mariadb.jdbc.MariaDbConnection@6bfcf5f (Connection.setNetworkTimeout cannot be called on a closed connection). Possibly consider using a shorter maxLifetime value.
2019-05-20 17:31:50.064 WARN 45164 --- [ main] com.zaxxer.hikari.pool.PoolBase : HikariPool-84 - Failed to validate connection org.mariadb.jdbc.MariaDbConnection@62a8e057 (Connection.setNetworkTimeout cannot be called on a closed connection). Possibly consider using a shorter maxLifetime value.
2019-05-20 17:31:50.065 WARN 45164 --- [ main] com.zaxxer.hikari.pool.PoolBase : HikariPool-84 - Failed to validate connection org.mariadb.jdbc.MariaDbConnection@19fc522c (Connection.setNetworkTimeout cannot be called on a closed connection). Possibly consider using a shorter maxLifetime value.
2019-05-20 17:31:50.066 WARN 45164 --- [ main] com.zaxxer.hikari.pool.PoolBase : HikariPool-84 - Failed to validate connection org.mariadb.jdbc.MariaDbConnection@19201d11 (Connection.setNetworkTimeout cannot be called on a closed connection). Possibly consider using a shorter maxLifetime value.
Hibernate: select reportdefi0_.id as id1_9_, reportdefi0_.delivery_policy as delivery2_9_, reportdefi0_.enabled as enabled3_9_, reportdefi0_.name as name4_9_, reportdefi0_.parameter_policy as paramete5_9_, reportdefi0_.pipeline as pipeline6_9_, reportdefi0_.scheduling_policy as scheduli7_9_, reportdefi0_.schema_name as schema_n8_9_, reportdefi0_.transformation_policy as transfor9_9_ from report_definition reportdefi0_
2019-05-20 17:31:50.114 WARN 45164 --- [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 1146, SQLState: 42S02
2019-05-20 17:31:50.115 ERROR 45164 --- [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : (conn=2) Table 'qronicle.report_definition' doesn't exist
2019-05-20 17:31:50.139 INFO 45164 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-84 - Shutdown initiated...
2019-05-20 17:31:50.145 INFO 45164 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-84 - Shutdown completed.
[ERROR] Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 11.041 s <<< FAILURE! - in com.netapp.qronicle.jobs.ReportJobManagerTransactionalIT
[ERROR] ReportJobManager saveDeliverables method should have transactional behavior Time elapsed: 0.144 s <<< ERROR!
org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet
at com.netapp.qronicle.jobs.ReportJobManagerTransactionalIT.setupReportDefinition(ReportJobManagerTransactionalIT.kt:83)
Caused by: org.hibernate.exception.SQLGrammarException: could not extract ResultSet
at com.netapp.qronicle.jobs.ReportJobManagerTransactionalIT.setupReportDefinition(ReportJobManagerTransactionalIT.kt:83)
Caused by: java.sql.SQLSyntaxErrorException: (conn=2) Table 'qronicle.report_definition' doesn't exist
at com.netapp.qronicle.jobs.ReportJobManagerTransactionalIT.setupReportDefinition(ReportJobManagerTransactionalIT.kt:83)
Caused by: java.sql.SQLException:
Table 'qronicle.report_definition' doesn't exist
Query is: select reportdefi0_.id as id1_9_, reportdefi0_.delivery_policy as delivery2_9_, reportdefi0_.enabled as enabled3_9_, reportdefi0_.name as name4_9_, reportdefi0_.parameter_policy as paramete5_9_, reportdefi0_.pipeline as pipeline6_9_, reportdefi0_.scheduling_policy as scheduli7_9_, reportdefi0_.schema_name as schema_n8_9_, reportdefi0_.transformation_policy as transfor9_9_ from report_definition reportdefi0_
java thread: main
at com.netapp.qronicle.jobs.ReportJobManagerTransactionalIT.setupReportDefinition(ReportJobManagerTransactionalIT.kt:83)
[INFO]运行com.netapp.qronicle.jobs.ReportJobManagerTransactionalIT
2019-05-20 17:31:50.049警告45164---[main]com.zaxxer.hikari.pool.PoolBase:HikariPool-84-无法验证连接org.mariadb.jdbc。MariaDbConnection@678c1c13(无法在关闭的连接上调用Connection.setNetworkTimeout)。可能考虑使用较短的最大寿命值。
2019-05-20 17:31:50.055警告45164---[main]com.zaxxer.hikari.pool.PoolBase:HikariPool-84-验证连接org.mariadb.jdbc失败。MariaDbConnection@4c8a0916(无法在关闭的连接上调用Connection.setNetworkTimeout)。可能考虑使用较短的最大寿命值。
2019-05-20 17:31:50.056警告45164---[main]com.zaxxer.hikari.pool.PoolBase:HikariPool-84-验证连接org.mariadb.jdbc失败。MariaDbConnection@3d189ad8(无法在关闭的连接上调用Connection.setNetworkTimeout)。可能考虑使用较短的最大寿命值。
2019-05-20 17:31:50.057警告45164---[main]com.zaxxer.hikari.pool.PoolBase:HikariPool-84-验证连接org.mariadb.jdbc失败。MariaDbConnection@110ff601(无法在关闭的连接上调用Connection.setNetworkTimeout)。可能考虑使用较短的最大寿命值。
2019-05-20 17:31:50.060警告45164---[main]com.zaxxer.hikari.pool.PoolBase:HikariPool-84-验证连接org.mariadb.jdbc失败。MariaDbConnection@2cdda367(无法在关闭的连接上调用Connection.setNetworkTimeout)。可能考虑使用较短的最大寿命值。
2019-05-20 17:31:50.061警告45164---[main]com.zaxxer.hikari.pool.PoolBase:HikariPool-84-验证连接org.mariadb.jdbc失败。MariaDbConnection@43bcef96(无法在关闭的连接上调用Connection.setNetworkTimeout)。可能考虑使用较短的最大寿命值。
2019-05-20 17:31:50.063警告45164---[main]com.zaxxer.hikari.pool.PoolBase:HikariPool-84-验证连接org.mariadb.jdbc失败。MariaDbConnection@6bfcf5f(无法在关闭的连接上调用Connection.setNetworkTimeout)。可能考虑使用较短的最大寿命值。
2019-05-20 17:31:50.064警告45164---[main]com.zaxxer.hikari.pool.PoolBase:HikariPool-84-验证连接org.mariadb.jdbc失败。MariaDbConnection@62a8e057(无法在关闭的连接上调用Connection.setNetworkTimeout)。可能考虑使用较短的最大寿命值。
2019-05-20 17:31:50.065警告45164---[main]com.zaxxer.hikari.pool.PoolBase:HikariPool-84-验证连接org.mariadb.jdbc失败。MariaDbConnection@19fc522c(无法在关闭的连接上调用Connection.setNetworkTimeout)。可能考虑使用较短的最大寿命值。
2019-05-20 17:31:50.066警告45164---[main]com.zaxxer.hikari.pool.PoolBase:HikariPool-84-验证连接org.mariadb.jdbc失败。MariaDbConnection@19201d11(无法在关闭的连接上调用Connection.setNetworkTimeout)。可能考虑使用较短的最大寿命值。
Hibernate:选择reportdefi0.id作为id1\u 9\u,reportdefi0.delivery\u策略作为delivery2\u 9\u,reportdefi0.enabled作为enabled3\u 9\u,reportdefi0\u.name作为name4\u 9\u,reportdefi0\u.parameter\u策略作为Parameter5\u 9\u,reportdefi0\u.pipeline作为pipeline6\u 9\u,reportdefi0\u,ReportDef0。转换策略从ReportDef0定义为Transformor9_
2019-05-20 17:31:50.114警告45164---[main]o.h.engine.jdbc.spi.SqlExceptionHelper:SQL错误:1146,SQLState:42S02
2019-05-20 17:31:50.115错误45164---[main]o.h.engine.jdbc.spi.SqlExceptionHelper:(conn=2)表'qronicle.report_definition'不存在
2019-05-20 17:31:50.139信息45164---[main]com.zaxxer.hikari.HikariDataSource:hikaripol-84-已启动关机。。。
2019-05-20 17:31:50.145信息45164---[main]com.zaxxer.hikari.HikariDataSource:hikaripol-84-关闭完成。
[错误]测试运行:1,失败:0,错误:1,跳过:0,经过的时间:11.041秒
package com.netapp.qronicle.jobs
import com.netapp.qronicle.EmbeddedMariaDBLifecycle
import com.netapp.qronicle.model.internal.ReportDefinition
import com.netapp.qronicle.model.internal.ReportDeliverable
import com.netapp.qronicle.monitoring.PipelineMetrics
import com.netapp.qronicle.monitoring.ReportJobManagerMetrics
import com.netapp.qronicle.pipelines.PipelineFactory.ValidPipeline.AWS_CLOUD_VOLUMES
import com.netapp.qronicle.policies.delivery.Deliverable
import com.netapp.qronicle.policies.delivery.DeliverableType
import com.netapp.qronicle.policies.delivery.createRetentionProcessor
import com.netapp.qronicle.policies.parameters.PipelineParameters
import com.netapp.qronicle.registry.ValidDeliveryPolicy.EMAIL_RETENTION
import com.netapp.qronicle.registry.ValidParameterPolicy.OFFSET_DAILY
import com.netapp.qronicle.registry.ValidTransformationPolicy.NO_TRANSFORMATION
import com.netapp.qronicle.reports.ReportPipeline
import com.netapp.qronicle.reports.ReportPipelineResult
import com.netapp.qronicle.reports.SingleReportPipelineResult
import com.netapp.qronicle.repositories.internal.ReportDefinitionRepository
import com.netapp.qronicle.repositories.internal.ReportDeliverableRepository
import com.netapp.qronicle.repositories.internal.ReportOutputRepository
import com.netapp.qronicle.repositories.internal.ReportRetentionRepository
import io.micrometer.core.instrument.simple.SimpleMeterRegistry
import io.mockk.every
import io.mockk.mockk
import org.aspectj.lang.Aspects
import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.BeforeAll
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.extension.ExtendWith
import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase
import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase.Replace
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest
import org.springframework.context.annotation.AdviceMode
import org.springframework.test.annotation.DirtiesContext
import org.springframework.test.annotation.Rollback
import org.springframework.test.context.ActiveProfiles
import org.springframework.test.context.junit.jupiter.SpringExtension
import org.springframework.transaction.annotation.EnableTransactionManagement
import javax.inject.Inject
@ExtendWith(SpringExtension::class, EmbeddedMariaDBLifecycle::class)
@DataJpaTest
@AutoConfigureTestDatabase(replace = Replace.NONE)
@ActiveProfiles("test")
@EnableTransactionManagement(mode = AdviceMode.ASPECTJ)
class ReportJobManagerTransactionalIT {
companion object {
/**
* The aspects must be initialized with counters so that the late-init properties are initialized. These
* counters don't have to specifically be named correctly--just initialized so compile-time weaving code
* executes properly.
*/
@BeforeAll
@JvmStatic
fun initAspect() {
val registry = SimpleMeterRegistry()
val pipelineMetricsAspect = Aspects.aspectOf(PipelineMetrics::class.java)
pipelineMetricsAspect.pipelinesSucceeded = registry.counter("test.pipelinesSucceeded")
pipelineMetricsAspect.pipelinesFailed = registry.counter("test.pipelinesFailed")
pipelineMetricsAspect.pipelineCreateCalls = registry.counter("test.pielinesCreated")
val reportJobManagerMetricsAspect = Aspects.aspectOf(ReportJobManagerMetrics::class.java)
reportJobManagerMetricsAspect.errorCount = registry.counter("test.errorCount")
reportJobManagerMetricsAspect.callCount = registry.counter("test.callCount")
}
}
@Inject
lateinit var reportOutputRepo: ReportOutputRepository
@Inject
lateinit var reportDefinitionRepo: ReportDefinitionRepository
@Inject
lateinit var deliverableRepository: ReportDeliverableRepository
@Inject
lateinit var retentionRepository: ReportRetentionRepository
@BeforeEach
fun setupReportDefinition() {
reportDefinitionRepo.deleteAll()
reportOutputRepo.deleteAll()
deliverableRepository.deleteAll()
val def = ReportDefinition()
def.deliveryPolicy = EMAIL_RETENTION
def.parameterPolicy = OFFSET_DAILY
def.name = "testDef"
def.schemaName = "test"
def.pipeline = AWS_CLOUD_VOLUMES
def.transformationPolicy = NO_TRANSFORMATION
def.attributes = mapOf(
"test.delivery.email.host" to "testhost",
"test.delivery.email.username" to "testuser",
"test.delivery.email.password" to "testpw",
"test.delivery.email.fromAddress" to "guy@place.com",
"test.delivery.email.toAddresses" to "otherguy@otherplace.com",
"test.delivery.email.port" to "123",
"test.delivery.email.composite0.csvFileName" to "test.csv",
"test.delivery.csvFileName" to "test.csv",
"test.delivery.retention.reportType" to "MS_INTERNAL_BILLING",
"test.delivery.retention.customerName" to "Microsoft",
"test.delivery.retention.dataCenterId" to "DC1",
"test.delivery.timezone" to "UTC",
"test.delivery.offsetAmount" to "1",
"test.delivery.offsetUnit" to "DAYS"
)
reportDefinitionRepo.save(def)
}
@Test
@Rollback(false)
@DirtiesContext
fun `ReportJobManager saveDeliverables method should have transactional behavior`() {
val brokenDeliverableRepo = mockk<ReportDeliverableRepository>()
every { brokenDeliverableRepo.save(any<ReportDeliverable>()) } throws RuntimeException("Oh no")
val reportJobManager = ReportJobManager(reportOutputRepo, brokenDeliverableRepo, mockk(relaxed = true), mockk(relaxed = true), mockk(relaxed = true))
val savedDef = reportDefinitionRepo.findByName("testDef") ?: Assertions.fail("Could not find report definition in DB")
val pipeline = object : ReportPipeline {
override val isValid = true
override fun runPipeline(): List<ReportPipelineResult> = emptyList()
override fun validate(): List<String> = emptyList()
override val parameterPolicy = object : PipelineParameters {
override fun generateReportOutputName() = "testOutputName"
}
override val postProcessors = listOf(createRetentionProcessor(retentionRepository))
}
val deliverable = Deliverable(
deliverable = "stuff".toByteArray(),
mimeType = "text/plain",
deliverableName = "testDeliverableName",
successful = true,
type = DeliverableType.AWS_CSV_ROW
)
val result = SingleReportPipelineResult(
deliverables = listOf(deliverable),
isSuccessful = true,
error = null
)
Assertions.assertThrows(RuntimeException::class.java) {
reportJobManager.saveOutput(savedDef, pipeline, listOf(result), null)
}
Assertions.assertEquals(0, reportOutputRepo.findAll().count()) { "Report outputs should not be found" }
Assertions.assertEquals(0, deliverableRepository.findAll().count()) { "Deliverables were found" }
}
}