junit @自动连线在测试容器内不工作

tjrkku2a  于 2022-11-11  发布在  其他
关注(0)|答案(1)|浏览(140)

我正在使用测试容器对MSSQLServer映像进行集成测试,当我尝试插入存储库时,收到以下错误:

lateinit property modelRepository has not been initialized

这让我很困惑,因为我使用的路径与创建测试时使用的路径相同,但在另一个项目中使用的是postgress数据库。
我的测试存档:

package *.models.integration

import *.portadapter.repository.ModelRepository
import *.builders.ModelBuilder
import org.junit.ClassRule
import org.junit.Test
import org.junit.jupiter.api.Assertions.assertEquals
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest
import org.springframework.test.context.DynamicPropertyRegistry
import org.springframework.test.context.DynamicPropertySource
import org.testcontainers.containers.MSSQLServerContainer
import org.testcontainers.containers.startupcheck.MinimumDurationRunningStartupCheckStrategy
import org.testcontainers.junit.jupiter.Testcontainers
import java.time.Duration
import java.util.function.Supplier

@DataJpaTest
@Testcontainers
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class ModelRepositoryTest {

    @Autowired
    private lateinit var modelRepository: ModelRepository

    companion object {
        private val hibernateDriver: Supplier<Any> = Supplier { "org.hibernate.dialect.SQLServerDialect" }
        private val hibernateDll: Supplier<Any> = Supplier { "none" }

        @ClassRule
        @JvmField
        val mssqlserver: MSSQLServerContainer<*> = MSSQLServerContainer("mcr.microsoft.com/mssql/server:2017-latest")
            .withStartupCheckStrategy(MinimumDurationRunningStartupCheckStrategy(Duration.ofSeconds(5)))
            .acceptLicense()

        @JvmStatic
        @DynamicPropertySource
        fun properties(registry: DynamicPropertyRegistry) {
            registry.add("spring.datasource.url", mssqlserver::getJdbcUrl)
            registry.add("spring.datasource.username", mssqlserver::getUsername)
            registry.add("spring.datasource.password", mssqlserver::getPassword)
            registry.add("spring.jpa.properties.hibernate.dialect", hibernateDriver)
            registry.add("spring.jpa.hibernate.ddl-auto", hibernateDll)

            mssqlserver.acceptLicense().start()
        }
    }

    @Test
    fun `it should save a model`() {
        val model = ModelBuilder().createModel().get()
        modelRepository.save(model)

        val modelFound = modelRepository.findByCode(model.code)

        assertEquals(model.code, modelFound.get().code)
    }
}

我的存储库:

package *.portadapter.repository

import *.model.domain.Model
import org.springframework.data.jpa.repository.JpaRepository
import java.util.*

interface ModelRepository: JpaRepository<Model, String> {
    fun findByCode(code: String): Optional<Model>
}

谁能帮帮我

z3yyvxxp

z3yyvxxp1#

请确保您使用的是junit4或junit5中的正确类。
正如我在上面的评论中提到的,在提供的测试中,来自junit4和junit5的导入是混合的。
Junit4公司

import org.junit.ClassRule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.data.jdbc.DataJdbcTest;
import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.DynamicPropertyRegistry;
import org.springframework.test.context.DynamicPropertySource;
import org.springframework.test.context.junit4.SpringRunner;
import org.testcontainers.containers.MSSQLServerContainer;

import java.util.List;
import java.util.Map;

import static org.assertj.core.api.Assertions.assertThat;

@RunWith(SpringRunner.class)
@DataJdbcTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
public class SqlserverDemoApplication3Tests {

    @ClassRule
    public static MSSQLServerContainer sqlserver = new MSSQLServerContainer("mcr.microsoft.com/mssql/server:2017-CU12")
            .acceptLicense();

    @DynamicPropertySource
    static void sqlserverProperties(DynamicPropertyRegistry registry) {
        registry.add("spring.datasource.url", sqlserver::getJdbcUrl);
        registry.add("spring.datasource.username", sqlserver::getUsername);
        registry.add("spring.datasource.password", sqlserver::getPassword);
    }

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Test
    public void contextLoads() {
        this.jdbcTemplate.update("insert into profile (name) values ('profile-1')");
        List<Map<String, Object>> records = this.jdbcTemplate.queryForList("select * from profile");
        assertThat(records).hasSize(1);
    }

}

军5

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.data.jdbc.DataJdbcTest;
import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.DynamicPropertyRegistry;
import org.springframework.test.context.DynamicPropertySource;
import org.testcontainers.containers.MSSQLServerContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;

import java.util.List;
import java.util.Map;

import static org.assertj.core.api.Assertions.assertThat;

@Testcontainers
@DataJdbcTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class SqlserverDemoApplication2Tests {

    @Container
    private static MSSQLServerContainer sqlserver = new MSSQLServerContainer("mcr.microsoft.com/mssql/server:2017-CU12")
            .acceptLicense();

    @DynamicPropertySource
    static void sqlserverProperties(DynamicPropertyRegistry registry) {
        registry.add("spring.datasource.url", sqlserver::getJdbcUrl);
        registry.add("spring.datasource.username", sqlserver::getUsername);
        registry.add("spring.datasource.password", sqlserver::getPassword);
    }

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Test
    void contextLoads() {
        this.jdbcTemplate.update("insert into profile (name) values ('profile-1')");
        List<Map<String, Object>> records = this.jdbcTemplate.queryForList("select * from profile");
        assertThat(records).hasSize(1);
    }

}

相关问题