Проблема с контейнером БД в TestContainers с использованием SpringBootTest - PullRequest
0 голосов
/ 08 декабря 2018

У меня есть абстрактный класс BaseIntegrationTest, который использует TestContainers.Проблема в том, что когда я пытаюсь запустить простой тест БД, такой как UserRepositoryIntSpec, у меня возникает исключение, которое означает, что отсчет начинается с 114, а не с 1, как ожидалось.Почему индекс не начинается с 1?Почему каждый раз, когда выполняется настройка, моя локальная таблица пользователей базы данных ясна, поскольку я ожидаю, что тест будет запущен в контейнере с использованием контейнера базы данных, поэтому будет очищена только таблица контейнера.Это определенно должно быть что-то легкое, что я просто пропустил или не понял.Буду признателен за помощь.

Для миграций я использую Flyway, для тестирования Спока.

Условие не выполнено:

user1.getId() == 1 && user1.getRiskcustomerid() == 1 && user1.getDateCreated() != null
|     |       |    |                                 |
|     114     |    false                             false
|             false

BaseIntegrationTest

@ContextConfiguration
@SpringBootTest(webEnvironment = DEFINED_PORT)
@Testcontainers
@Slf4j
abstract class BaseIntegrationTest extends Specification {

protected static PostgreSQLContainer postgres = new PostgreSQLContainer()
        .withDatabaseName("db")
        .withUsername("root")
        .withPassword("root")

def setupSpec() {
    startPostgresIfNeeded()
    ['spring.datasource.url'     : postgres.getJdbcUrl(),
     'spring.datasource.username': postgres.getUsername(),
     'spring.datasource.password': postgres.getPassword()
    ].each { k, v ->
        System.setProperty(k, v)
    }
}

private static void startPostgresIfNeeded() {
    if (!postgres.isRunning()) {
        log.info("[BASE-INTEGRATION-TEST] - Postgres is not started. Running...")
        postgres.start()
    }
}

def cleanupSpec() {
    if (postgres.isRunning()) {
        log.info("[BASE-INTEGRATION-TEST] - Stopping Postgres...")
        postgres.stop()
    }
}
}

UserRepositoryIntSpec

class UserRepositoryIntSpec extends BaseIntegrationTest {

    @Autowired
    private UserRepository UserRepository

    def setup() {
        UserRepository.deleteAll()
    }

    def "FindAll returns all users correctly"() {
        given:
        List<Integer> friends = [1,2]
        User User1 = User.builder()
                .riskcustomerid(1)
                .possibleids([1000, 1001])
                .preferableid(1000)
                .totalfriendscount(2)
                .friends(friends)
                .build()
        User User2 = User.builder()
                .riskcustomerid(2)
                .possibleids([8000, 8001])
                .preferableid(8000)
                .totalfriendscount(3)
                .friends(friends)
                .build()

        when:
        UserRepository.saveAll([User1, User2])

        then:
        List<User> Users = UserRepository.findAll()
        assert Users.size() == 2
        User user1 = Users.get(0)
        User user2 = Users.get(1)
        assert user1.getId() == 1 && user1.getRiskcustomerid() == 1 && user1.getDateCreated() != null
        assert user2.getId() == 2 && user2.getRiskcustomerid() == 2 && user2.getDateCreated() != null
    }

Application.yml

spring:
  datasource:
    url:  jdbc:postgresql://localhost:5432/db
    username: root
    password: root
    hikari:
      connection-timeout: 10000
      leak-detection-threshold: 60000
      validation-timeout: 30000
      connection-test-query: SELECT 1;
      jdbc-url: jdbc:postgresql://localhost:5432/db
      username: root
      password: root
      data-source-properties: stringtype=unspecified
      maximum-pool-size: 16
      max-lifetime: 1800000
      transaction-isolation: TRANSACTION_READ_COMMITTED
      pool-name: hikari.local
    driver-class-name: org.postgresql.Driver
  jpa:
    hibernate:
      ddl-auto: update
  flyway:
    schemas: schema1
    baseline-on-migrate: false
server:
  port: 8080

1 Ответ

0 голосов
/ 10 декабря 2018

Я вижу, что вы используете url: jdbc:postgresql://localhost:5432/db.Вы буквально говорите «пожалуйста, запустите мою локальную БД»:)

Для вашего случая использования я предлагаю использовать контейнеры на основе JDBC в Testcontainers.Он автоматически запустит контейнер и уничтожит его, когда вы закроете последнее подключение к нему.

...