Несколько экземпляров DynamoDbLocal для каждого класса модульного теста или экземпляра синглтона
Я пытаюсь использовать сервер DynamoDbLocal для тестовых случаев. И придумал два варианта,
Либо определите правило класса junit, которое запускает локальный сервер перед классом и останавливает его после класса. Таким образом, по существу, он будет запускать и останавливать сервер для каждого класса модульного тестирования.
public class MyDynamoDbLocalServerRule extends ExternalResource {
@Override
protected void before() throws Throwable {
myInMemoryDynamoDbServer.start();
}
@Override
protected void after() throws Throwable{
inMemoryDynamoDbServer.stop();
}
ИЛИ ЖЕ
Единственный экземпляр:
public static DynamoDBProxyServerContainer createInstance(final int portToListenIn) {
if (dynamoLocal == null) {
synchronized (DynamoDBProxyServerContainer.class) {
if (dynamoLocal == null) {
dynamoLocal = new DynamoDBProxyServerContainer(portToListenIn);
}
}
}
return dynamoLocal;
}
private DynamoDBProxyServerContainer(final int portToListenIn) {
this.startServer(portToListenIn);
getRuntime().addShutdownHook(new Thread(() -> stopServer()));
}
Какой из них вы бы порекомендовали, и вам лучше это делать? Обратите внимание, что я должен иметь возможность использовать его с инфраструктурой внедрения зависимостей Guice.
1 ответ
Я бы порекомендовал подход Singleton, так как создание экземпляра базы данных для каждого теста будет трудоемким вариантом. Кроме того, если у вас много тестовых случаев, модульное тестирование может занять больше времени для завершения. Если у вас есть непрерывная интеграция, сборка и модульное тестирование займет больше времени.
Поскольку модульные тесты выполняются последовательно, вам не нужен отдельный экземпляр для каждого теста.