Упрощенное локальное тестирование DynamoDB
Я использую DynamoDB local для модульного тестирования. Это не плохо, но имеет некоторые недостатки. В частности:
- Вы должны как-то запустить сервер до запуска ваших тестов
- Сервер не запускается и не останавливается перед каждым тестом, поэтому тесты становятся взаимозависимыми, если вы не добавите код для удаления всех таблиц и т. Д. После каждого теста
- Все разработчики должны иметь его
То, что я хочу сделать, это что-то вроде поместить локальный jar-файл DynamoDB и другие jar-файлы, от которых он зависит, в мой каталог test/resources (я пишу на Java). Затем перед каждым тестом я запускаю его, -inMemory
и после теста я бы остановил это. Таким образом, любой, кто сносит репозиторий git, получает копию всего, что ему нужно для запуска тестов, и каждый тест не зависит от других.
Я нашел способ сделать эту работу, но это некрасиво, поэтому я ищу альтернативы. Решение, которое у меня есть, состоит в том, чтобы поместить файл.zip с локальным содержимым DynamoDB в test/resources, затем в метод @Before, я извлеку его во временный каталог и запустил новый процесс Java для его выполнения. Это работает, но уродливо и имеет некоторые недостатки:
- Каждый нуждается в исполняемом файле Java на их $PATH
- Я должен распаковать zip на локальный диск. Использование локального диска часто рискованно для тестирования, особенно при непрерывной сборке и тому подобном.
- Я должен порождать процесс и ждать его запуска для каждого модульного теста, а затем убивать этот процесс после каждого теста. Помимо медлительности, потенциал для отложенных процессов кажется уродливым.
Кажется, должен быть более легкий путь. В конце концов, DynamoDB Local - это всего лишь код Java. Не могу ли я как-нибудь попросить JVM разветвиться и заглянуть в ресурсы для создания пути к классам? Или, что еще лучше, я не могу просто позвонить main
метод DynamoDb Local из какого-то другого потока, так что все это происходит в одном процессе? Есть идеи?
PS: я знаю об Alternator, но у него, похоже, есть и другие недостатки, поэтому я склонен придерживаться поддерживаемого решения Amazon, если смогу заставить его работать.
14 ответов
Чтобы использовать DynamoDBLocal, вам необходимо выполнить следующие шаги.
- Получите прямую зависимость DynamoDBLocal
- Получите собственные зависимости SQLite4Java
- Задавать
sqlite4java.library.path
показать родные библиотеки
1. Получите прямую зависимость от DynamoDBLocal
Этот самый легкий. Вам нужен этот репозиторий, как описано на форумах AWS.
<!--Dependency:-->
<dependencies>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>DynamoDBLocal</artifactId>
<version>1.11.0.1</version>
<scope></scope>
</dependency>
</dependencies>
<!--Custom repository:-->
<repositories>
<repository>
<id>dynamodb-local</id>
<name>DynamoDB Local Release Repository</name>
<url>https://s3-us-west-2.amazonaws.com/dynamodb-local/release</url>
</repository>
</repositories>
2. Получите собственные зависимости SQLite4Java
Если вы не добавите эти зависимости, ваши тесты не пройдут с внутренней ошибкой 500.
Сначала добавьте эти зависимости:
<dependency>
<groupId>com.almworks.sqlite4java</groupId>
<artifactId>sqlite4java</artifactId>
<version>1.0.392</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.almworks.sqlite4java</groupId>
<artifactId>sqlite4java-win32-x86</artifactId>
<version>1.0.392</version>
<type>dll</type>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.almworks.sqlite4java</groupId>
<artifactId>sqlite4java-win32-x64</artifactId>
<version>1.0.392</version>
<type>dll</type>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.almworks.sqlite4java</groupId>
<artifactId>libsqlite4java-osx</artifactId>
<version>1.0.392</version>
<type>dylib</type>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.almworks.sqlite4java</groupId>
<artifactId>libsqlite4java-linux-i386</artifactId>
<version>1.0.392</version>
<type>so</type>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.almworks.sqlite4java</groupId>
<artifactId>libsqlite4java-linux-amd64</artifactId>
<version>1.0.392</version>
<type>so</type>
<scope>test</scope>
</dependency>
Затем добавьте этот плагин, чтобы получить собственные зависимости к определенной папке:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.10</version>
<executions>
<execution>
<id>copy</id>
<phase>test-compile</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<includeScope>test</includeScope>
<includeTypes>so,dll,dylib</includeTypes>
<outputDirectory>${project.basedir}/native-libs</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
3. Установить sqlite4java.library.path
показать родные библиотеки
Как последний шаг, вам нужно установить sqlite4java.library.path
системное свойство к каталогу native-libs. Это можно сделать непосредственно перед созданием локального сервера.
System.setProperty("sqlite4java.library.path", "native-libs");
После этих шагов вы можете использовать DynamoDBLocal, как вы хотите. Вот правило Junit, которое создает для этого локальный сервер.
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient;
import com.amazonaws.services.dynamodbv2.local.main.ServerRunner;
import com.amazonaws.services.dynamodbv2.local.server.DynamoDBProxyServer;
import org.junit.rules.ExternalResource;
import java.io.IOException;
import java.net.ServerSocket;
/**
* Creates a local DynamoDB instance for testing.
*/
public class LocalDynamoDBCreationRule extends ExternalResource {
private DynamoDBProxyServer server;
private AmazonDynamoDB amazonDynamoDB;
public LocalDynamoDBCreationRule() {
// This one should be copied during test-compile time. If project's basedir does not contains a folder
// named 'native-libs' please try '$ mvn clean install' from command line first
System.setProperty("sqlite4java.library.path", "native-libs");
}
@Override
protected void before() throws Throwable {
try {
final String port = getAvailablePort();
this.server = ServerRunner.createServerFromCommandLineArgs(new String[]{"-inMemory", "-port", port});
server.start();
amazonDynamoDB = new AmazonDynamoDBClient(new BasicAWSCredentials("access", "secret"));
amazonDynamoDB.setEndpoint("http://localhost:" + port);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
protected void after() {
if (server == null) {
return;
}
try {
server.stop();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public AmazonDynamoDB getAmazonDynamoDB() {
return amazonDynamoDB;
}
private String getAvailablePort() {
try (final ServerSocket serverSocket = new ServerSocket(0)) {
return String.valueOf(serverSocket.getLocalPort());
} catch (IOException e) {
throw new RuntimeException("Available port was not found", e);
}
}
}
Вы можете использовать это правило, как это
@RunWith(JUnit4.class)
public class UserDAOImplTest {
@ClassRule
public static final LocalDynamoDBCreationRule dynamoDB = new LocalDynamoDBCreationRule();
}
В августе 2018 года Amazon анонсировала новый образ Docker с встроенным Amazon DynamoDB Local. Это не требует загрузки и запуска каких-либо JAR-файлов, а также добавления с использованием сторонних специфичных для ОС двоичных файлов (я говорю о sqlite4java
).
Это так же просто, как запуск контейнера Docker перед тестами:
docker run -p 8000:8000 amazon/dynamodb-local
Вы можете сделать это вручную для локальной разработки, как описано выше, или использовать его в своем конвейере CI. Многие сервисы CI предоставляют возможность запуска дополнительных контейнеров во время конвейера, которые могут предоставить зависимости для ваших тестов. Вот пример для Gitlab CI/CD:
test:
stage: test
image: openjdk:8-alpine
services:
- name: amazon/dynamodb-local
alias: dynamodb-local
script:
- DYNAMODB_LOCAL_URL=http://dynamodb-local:8000 ./gradlew clean test
Или Bitbucket Pipelines:
definitions:
services:
dynamodb-local:
image: amazon/dynamodb-local
…
step:
name: test
image:
name: openjdk:8-alpine
services:
- dynamodb-local
script:
- DYNAMODB_LOCAL_URL=http://localhost:8000 ./gradlew clean test
И так далее. Идея состоит в том, чтобы переместить всю конфигурацию, которую вы видите в других ответах, из вашего инструмента сборки и обеспечить зависимость извне. Думайте об этом как о внедрении зависимости / IoC, но для всего сервиса, а не только одного компонента.
После запуска контейнера вы можете создать клиент, указывающий на него:
private AmazonDynamoDB createAmazonDynamoDB(final DynamoDBLocal configuration) {
return AmazonDynamoDBClientBuilder
.standard()
.withEndpointConfiguration(
new AwsClientBuilder.EndpointConfiguration(
"http://localhost:8000",
Regions.US_EAST_1.getName()
)
)
.withCredentials(
new AWSStaticCredentialsProvider(
// DynamoDB Local works with any non-null credentials
new BasicAWSCredentials("", "")
)
)
.build();
}
Теперь к оригинальным вопросам:
Вы должны каким-то образом запустить сервер до запуска ваших тестов
Вы можете просто запустить его вручную или подготовить для него скрипт разработчика. Среды IDE обычно предоставляют способ запуска произвольных команд перед выполнением задачи, поэтому вы можете создать среду IDE для запуска контейнера за вас. Я думаю, что запуск чего-либо локально не должен быть главным приоритетом в этом случае, но вместо этого вы должны сосредоточиться на настройке CI и позволить разработчикам запускать контейнер так, как им удобно.
Сервер не запускается и не останавливается перед каждым тестом, поэтому тесты становятся взаимозависимыми, если вы не добавите код для удаления всех таблиц и т. Д. После каждого теста.
Это правда, но... Вы не должны запускать и останавливать такие тяжелые вещи и воссоздавать таблицы до / после каждого теста. Тесты БД почти всегда взаимозависимы, и это нормально для них. Просто используйте уникальные значения для каждого теста (например, установите хэш-ключ элемента для идентификатора заявки / конкретного теста, над которым вы работаете). Что касается начальных данных, я бы порекомендовал удалить их из инструмента сборки и тестового кода. Либо создайте свой собственный образ со всеми необходимыми данными, либо используйте AWS CLI для создания таблиц и вставки данных. Следуйте принципу единой ответственности и принципам внедрения зависимостей: ваш тестовый код не должен делать ничего, кроме тестов. Вся среда (таблицы и данные в этом случае должны быть предоставлены для них). Создание таблицы в тесте неправильно, потому что в реальной жизни эта таблица уже существует (конечно, если вы не тестируете метод, который фактически создает таблицу).
Все разработчики должны иметь это установлено
Докер должен быть обязательным для каждого разработчика в 2018 году, так что это не проблема.
И если вы используете JUnit 5, может быть хорошей идеей будет использовать расширение DynamoDB Local, которое внедрит клиента в ваши тесты (да, я делаю саморекламу):
Добавьте репозиторий JCenter в вашу сборку.
pom.xml:
<repositories> <repository> <snapshots> <enabled>false</enabled> </snapshots> <id>central</id> <name>bintray</name> <url>https://jcenter.bintray.com</url> </repository> </repositories>
build.gradle
repositories { jcenter() }
Добавить зависимость от
by.dev.madhead.aws-junit5:dynamodb-v1
pom.xml:
<dependency> <groupId>by.dev.madhead.aws-junit5</groupId> <artifactId>dynamodb-v1</artifactId> <version>1.0.0</version> <scope>test</scope> </dependency>
build.gradle
dependencies { testImplementation("by.dev.madhead.aws-junit5:dynamodb-v1:1.0.0") }
Используйте расширение в своих тестах:
@ExtendWith(DynamoDBLocalExtension.class) class MultipleInjectionsTest { @DynamoDBLocal( url = "http://dynamodb-local-1:8000" ) private AmazonDynamoDB first; @DynamoDBLocal( urlEnvironmentVariable = "DYNAMODB_LOCAL_URL" ) private AmazonDynamoDB second; @Test void test() { first.listTables(); second.listTables(); } }
Это повторение ответа bhdrkn для пользователей Gradle (он основан на Maven). Это все те же три шага:
- Получите прямую зависимость DynamoDBLocal
- Получите собственные зависимости SQLite4Java
- Установите sqlite4java.library.path для отображения собственных библиотек
1. Получите прямую зависимость от DynamoDBLocal
Добавьте в раздел зависимостей вашего файла build.gradle...
dependencies {
testCompile "com.amazonaws:DynamoDBLocal:1.+"
}
2. Получите собственные зависимости SQLite4Java
Библиотеки sqlite4java уже будут загружены как зависимость от DynamoDBLocal, но файлы библиотеки необходимо скопировать в нужное место. Добавьте в свой файл build.gradle...
task copyNativeDeps(type: Copy) {
from(configurations.compile + configurations.testCompile) {
include '*.dll'
include '*.dylib'
include '*.so'
}
into 'build/libs'
}
3. Установите sqlite4java.library.path для отображения собственных библиотек.
Нам нужно сказать Gradle, чтобы бежать copyNativeDeps
для тестирования и скажите sqlite4java, где найти файлы. Добавьте в свой файл build.gradle...
test {
dependsOn copyNativeDeps
systemProperty "java.library.path", 'build/libs'
}
Вы можете использовать DynamoDB Local в качестве тестовой зависимости Maven в своем тестовом коде, как показано в этом объявлении. Вы можете запустить через HTTP:
import com.amazonaws.services.dynamodbv2.local.main.ServerRunner;
import com.amazonaws.services.dynamodbv2.local.server.DynamoDBProxyServer;
final String[] localArgs = { "-inMemory" };
DynamoDBProxyServer server = ServerRunner.createServerFromCommandLineArgs(localArgs);
server.start();
AmazonDynamoDB dynamodb = new AmazonDynamoDBClient();
dynamodb.setEndpoint("http://localhost:8000");
dynamodb.listTables();
server.stop();
Вы также можете запустить во встроенном режиме:
import com.amazonaws.services.dynamodbv2.local.embedded.DynamoDBEmbedded;
AmazonDynamoDB dynamodb = DynamoDBEmbedded.create();
dynamodb.listTables();
Я обернул ответы выше в два правила JUnit, которые не требуют изменений в сценарии сборки, поскольку правила обрабатывают нативную библиотеку. Я сделал это, когда обнаружил, что I dea не понравились решения Gradle/Maven, поскольку он просто вышел из строя и сделал что-то свое.
Это означает, что шаги:
- Получите зависимость AssortmentOfJUnitRules версии 1.5.32 или выше
- Получить прямую зависимость DynamoDBLocal
- Добавьте LocalDynamoDbRule или HttpDynamoDbRule в свой тест JUnit.
Maven:
<!--Dependency:-->
<dependencies>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>DynamoDBLocal</artifactId>
<version>1.11.0.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.github.mlk</groupId>
<artifactId>assortmentofjunitrules</artifactId>
<version>1.5.36</version>
<scope>test</scope>
</dependency>
</dependencies>
<!--Custom repository:-->
<repositories>
<repository>
<id>dynamodb-local</id>
<name>DynamoDB Local Release Repository</name>
<url>https://s3-us-west-2.amazonaws.com/dynamodb-local/release</url>
</repository>
</repositories>
Gradle:
repositories {
mavenCentral()
maven {
url = "https://s3-us-west-2.amazonaws.com/dynamodb-local/release"
}
}
dependencies {
testCompile "com.github.mlk:assortmentofjunitrules:1.5.36"
testCompile "com.amazonaws:DynamoDBLocal:1.+"
}
Код:
public class LocalDynamoDbRuleTest {
@Rule
public LocalDynamoDbRule ddb = new LocalDynamoDbRule();
@Test
public void test() {
doDynamoStuff(ddb.getClient());
}
}
Попробуйте испытание бури ! Он содержит правило JUnit4 и расширение JUnit5. Он также поддерживает как AWS SDK v1, так и SDK v2.
Tempest предоставляет библиотеку для тестирования клиентов с помощью DynamoDBDynamoDBLocal . Он поставляется с двумя реализациями:
- JVM: это предпочтительный вариант, запускающий
DynamoDBProxyServer
при поддержкеsqlite4java
, который доступен на большинстве платформ . - Docker: запускает Dynamodb-local в контейнере Docker.
Матрица характеристик:
Использовать
tempest-testing
, сначала добавьте эту библиотеку в качестве тестовой зависимости:
Для AWS SDK 1.x:
dependencies {
testImplementation "app.cash.tempest:tempest-testing-jvm:1.5.2"
testImplementation "app.cash.tempest:tempest-testing-junit5:1.5.2"
}
// Or
dependencies {
testImplementation "app.cash.tempest:tempest-testing-docker:1.5.2"
testImplementation "app.cash.tempest:tempest-testing-junit5:1.5.2"
}
Для AWS SDK 2.x:
dependencies {
testImplementation "app.cash.tempest:tempest2-testing-jvm:1.5.2"
testImplementation "app.cash.tempest:tempest2-testing-junit5:1.5.2"
}
// Or
dependencies {
testImplementation "app.cash.tempest:tempest2-testing-docker:1.5.2"
testImplementation "app.cash.tempest:tempest2-testing-junit5:1.5.2"
}
Затем в тестах, помеченных
@org.junit.jupiter.api.Test
, вы можете добавить
TestDynamoDb
как тестовое расширение . Это расширение запускает сервер DynamoDB. Он разделяет сервер между тестами и поддерживает его работу до завершения процесса. Он также управляет тестовыми таблицами для вас, воссоздавая их перед каждым тестом.
class MyTest {
@RegisterExtension
TestDynamoDb db = new TestDynamoDb.Builder(JvmDynamoDbServer.Factory.INSTANCE) // or DockerDynamoDbServer
// `MusicItem` is annotated with `@DynamoDBTable`. Tempest recreates this table before each test.
.addTable(TestTable.create(MusicItem.TABLE_NAME, MusicItem.class))
.build();
@Test
public void test() {
PutItemRequest request = // ...;
// Talk to the local DynamoDB.
db.dynamoDb().putItem(request);
}
}
Кажется, должен быть более простой способ. В конце концов, DynamoDB Local - это всего лишь код Java. Разве я не могу как-то попросить JVM разветвляться и заглядывать внутрь ресурсов для создания пути к классам?
Вы можете сделать что-то в этом роде, но гораздо проще: программно выполнить поиск в пути к классам для определения местоположения собственных библиотек, а затем установить
sqlite4java.library.path
свойство перед запуском DynamoDB. Это подход, реализованный в Tempest-testing , а также в этом ответе ( код здесь), поэтому они просто работают как чистая зависимость библиотеки / пути к классам и не более того.
В моем случае требовался доступ к DynamoDB вне расширения JUnit, но я все еще хотел что-то автономное в коде библиотеки, поэтому я выделил подход, который он использует:
import com.amazonaws.services.dynamodbv2.local.embedded.DynamoDBEmbedded;
import com.amazonaws.services.dynamodbv2.local.shared.access.AmazonDynamoDBLocal;
import com.google.common.collect.MoreCollectors;
import java.io.File;
import java.util.Arrays;
import java.util.stream.Stream;
import org.junit.jupiter.api.condition.OS;
...
public AmazonDynamoDBLocal embeddedDynamoDb() {
final OS os = Stream.of(OS.values()).filter(OS::isCurrentOs)
.collect(MoreCollectors.onlyElement());
final String prefix;
switch (os) {
case LINUX:
prefix = "libsqlite4java-linux-amd64-";
break;
case MAC:
prefix = "libsqlite4java-osx-";
break;
case WINDOWS:
prefix = "sqlite4java-win32-x64-";
break;
default:
throw new UnsupportedOperationException(os.toString());
}
System.setProperty("sqlite4java.library.path",
Arrays.asList(System.getProperty("java.class.path").split(File.pathSeparator))
.stream()
.map(File::new)
.filter(file -> file.getName().startsWith(prefix))
.collect(MoreCollectors.onlyElement())
.getParent());
return DynamoDBEmbedded.create();
}
Не было возможности протестировать на многих платформах, и обработку ошибок, вероятно, можно было бы улучшить.
Жаль, что AWS не удосужился сделать библиотеку более дружелюбной, так как это можно легко сделать в самом коде библиотеки.
В Hadoop мы также используем DynamoDBLocal для тестирования и отладки. Посмотрите, пожалуйста, как это используется в качестве примера на: https://github.com/apache/hadoop/blob/HADOOP-13345/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/s3guard/TestDynamoDBMetadataStore.java#L113
Кратчайшее решение с исправлением для
sqlite4java.SQLiteException UnsatisfiedLinkError
если это проект java / kotlin, построенный с помощью gradle (измененный
$PATH
это не требуется).
repositories {
// ... other dependencies
maven { url 'https://s3-us-west-2.amazonaws.com/dynamodb-local/release' }
}
dependencies {
testImplementation("com.amazonaws:DynamoDBLocal:1.13.6")
}
import org.gradle.internal.os.OperatingSystem
test {
doFirst {
// Fix for: UnsatisfiedLinkError -> provide a valid native lib path
String nativePrefix = OperatingSystem.current().nativePrefix
File nativeLib = sourceSets.test.runtimeClasspath.files.find {it.name.startsWith("libsqlite4java") && it.name.contains(nativePrefix) } as File
systemProperty "sqlite4java.library.path", nativeLib.parent
}
}
Простое использование в тестовых классах (
src/test
):
private lateinit var db: AmazonDynamoDBLocal
@BeforeAll
fun runDb() { db = DynamoDBEmbedded.create() }
@AfterAll
fun shutdownDb() { db.shutdown() }
Для DynamoDB Local есть пара упаковок node.js. Это позволяет легко выполнять модульные тесты в сочетании с бегунами задач, такими как gulp или grunt. Попробуйте DynamodB-локальный, DynamodB-локальный
Для модульного тестирования на работе я использую Mockito, а затем просто издеваюсь над AmazonDynamoDBClient. затем смоделируйте возвраты, используя когда. как следующее:
when(mockAmazonDynamoDBClient.getItem(isA(GetItemRequest.class))).thenAnswer(new Answer<GetItemResult>() {
@Override
public GetItemResult answer(InvocationOnMock invocation) throws Throwable {
GetItemResult result = new GetItemResult();
result.setItem( testResultItem );
return result;
}
});
Не уверен, что это то, что вы ищете, но именно так мы и делаем.
Я обнаружил, что репозиторий amazon не является индексным файлом, поэтому, похоже, не функционирует таким образом, чтобы это можно было сделать так:
maven {
url = "https://s3-us-west-2.amazonaws.com/dynamodb-local/release"
}
Единственный способ получить зависимости для загрузки - это загрузить DynamoDbLocal в качестве jar-файла и вставить его в мой скрипт сборки следующим образом:
dependencies {
...
runtime files('libs/DynamoDBLocal.jar')
...
}
Конечно, это означает, что все зависимости SQLite и Jetty нужно вводить вручную - я все еще пытаюсь понять это правильно. Если кто-нибудь знает о надежном репо для DynamoDbLocal, я бы очень хотел знать.
Зависимость DynamoDB Gradle уже включает библиотеки SQLite. Вы можете довольно легко указать среде выполнения Java использовать ее в своем скрипте сборки Gradle. Вот мой
build.gradle.kts
В качестве примера:
import org.apache.tools.ant.taskdefs.condition.Os
plugins {
application
}
repositories {
mavenCentral()
maven {
url = uri("https://s3-us-west-2.amazonaws.com/dynamodb-local/release")
}
}
dependencies {
implementation("com.amazonaws:DynamoDBLocal:[1.12,2.0)")
}
fun getSqlitePath(): String? {
val dirName = when {
Os.isFamily(Os.FAMILY_MAC) -> "libsqlite4java-osx"
Os.isFamily(Os.FAMILY_UNIX) -> "libsqlite4java-linux-amd64"
Os.isFamily(Os.FAMILY_WINDOWS) -> "sqlite4java-win32-x64"
else -> throw kotlin.Exception("DynamoDB emulator cannot run on this platform")
}
return project.configurations.runtimeClasspath.get().find { it.name.contains(dirName) }?.parent
}
application {
mainClass.set("com.amazonaws.services.dynamodbv2.local.main.ServerRunner")
applicationDefaultJvmArgs = listOf("-Djava.library.path=${getSqlitePath()}")
}
tasks.named<JavaExec>("run") {
args("-inMemory")
}
Вы также можете использовать этот легкий тестовый контейнер Dynalite.
https://www.testcontainers.org/modules/databases/dynalite/
Из тестовых контейнеров:
Dynalite - это клон DynamoDB, позволяющий проводить локальное тестирование. Он легкий и быстрый в использовании.