gpt4 book ai didi

java - JUnit 测试 - 我可以设置我的数据库连接以避免测试由于达到最大数据库连接而失败

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:12:08 24 4
gpt4 key购买 nike

我正在用 Java 做一些 DAO 测试,我定义了一个类来设置与测试数据库的连接,就像这样

import io.dropwizard.testing.ResourceHelpers;
import io.dropwizard.testing.junit.DropwizardAppRule;
import my.project.package.ProjectTestAppConfiguration;
import my.project.package.ProjectTestApplication;
import my.project.package.domain.ProjectClass1;
import org.hibernate.Session;
import org.hibernate.SessionException;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.junit.ClassRule;

import java.util.Map;
import java.util.logging.Level;

public class DAOTestConfig {
protected SessionFactory sessionFactory;

@ClassRule
public static final DropwizardAppRule<ProjectTestAppConfiguration> RULE =
new DropwizardAppRule<ProjectTestAppConfiguration>
(ProjectTestApplication.class, ResourceHelpers.resourceFilePath("applicationTest.yml"));

public DAOTestConfig() {
Map<String, String> properties = RULE.getConfiguration().getDataSourceFactory().getProperties();
Configuration configuration = new Configuration();
for (Map.Entry<String, String> property : properties.entrySet()) {
configuration.setProperty(property.getKey(), property.getValue());
}

/* Add annotated classes here */

configuration.addAnnotatedClass(ProjectClass1.class);

/* ... */

sessionFactory = configuration.buildSessionFactory();
}

public Session getSession() {
Session session;
try{
session = sessionFactory.getCurrentSession();
} catch (SessionException e) {
session = sessionFactory.openSession();
}
return session;
}
}

我的 applicationTest.yml 文件包含标准的数据库连接,比如

     # Database settings.
database:

# the name of your JDBC driver
driverClass: org.postgresql.Driver

# the username for DB
user: ${FH_DB_USER}

# the password
password: ${FH_DB_PASSWORD}

# the JDBC URL
url: jdbc:postgresql://${FH_DB_HOST}:${FH_DB_PORT}/${FH_DB_NAME}

# any properties specific to your JDBC driver:
properties:
charSet: UTF-8
hibernate.dialect: org.hibernate.dialect.PostgreSQLDialect
hibernate.connection.driver_class: org.postgresql.Driver
hibernate.temp.use_jdbc_metadata_defaults: false
hibernate.connection.url: jdbc:postgresql://${FH_DB_HOST}:${FH_DB_PORT}/${FH_DB_NAME}
hibernate.connection.username: ${FH_DB_USER}
hibernate.connection.password: ${FH_DB_PASSWORD}
hibernate.current_session_context_class: thread
hibernate.show_sql: true

我目前有 20 多个测试用例类,每个类平均有 5 个测试用例,连接到数据库。如您所见,我在我的产品中使用了 dropwizard 和 hibernate;我的 DAO 类使用 hibernate C-R-U-D(crate、read、updte、delete)方法,并且连接到 postgres 数据库。每个类扩展这个DAOTestConfig类。我在我的本地机器上运行测试,但我想使用远程数据库实例,现在我的一些测试失败并出现错误 Error calling Driver#connect

这是其中一个失败测试的堆栈跟踪示例:

    org.hibernate.exception.GenericJDBCException: Error calling Driver#connect
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:47)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:111)
at org.hibernate.engine.jdbc.connections.internal.BasicConnectionCreator.convertSqlException(BasicConnectionCreator.java:118)
at org.hibernate.engine.jdbc.connections.internal.DriverConnectionCreator.makeConnection(DriverConnectionCreator.java:41)
at org.hibernate.engine.jdbc.connections.internal.BasicConnectionCreator.createConnection(BasicConnectionCreator.java:58)
at org.hibernate.engine.jdbc.connections.internal.PooledConnections.addConnections(PooledConnections.java:106)
at org.hibernate.engine.jdbc.connections.internal.PooledConnections.<init>(PooledConnections.java:40)
at org.hibernate.engine.jdbc.connections.internal.PooledConnections.<init>(PooledConnections.java:19)
at org.hibernate.engine.jdbc.connections.internal.PooledConnections$Builder.build(PooledConnections.java:138)
at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl.buildPool(DriverManagerConnectionProviderImpl.java:110)
at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl.configure(DriverManagerConnectionProviderImpl.java:74)
at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:94)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:217)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:189)
at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.buildBootstrapJdbcConnectionAccess(JdbcEnvironmentInitiator.java:158)
at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.getBootstrapJdbcConnectionAccess(JdbcServicesImpl.java:71)
at org.jadira.usertype.spi.shared.AbstractUserTypeHibernateIntegrator.use42Api(AbstractUserTypeHibernateIntegrator.java:83)
at org.jadira.usertype.spi.shared.AbstractUserTypeHibernateIntegrator.integrate(AbstractUserTypeHibernateIntegrator.java:206)
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:276)
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:465)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:708)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:724)
at my.project.package.persistence.DAOTestConfig.<init>(DAOTestConfig.java:106)
at my.project.package.persistence.ProjectClass1DAOTest.<init>(ProjectClass1DAOTest.java:19)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.junit.runners.BlockJUnit4ClassRunner.createTest(BlockJUnit4ClassRunner.java:217)
at org.junit.runners.BlockJUnit4ClassRunner$1.runReflectiveCall(BlockJUnit4ClassRunner.java:266)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.BlockJUnit4ClassRunner.methodBlock(BlockJUnit4ClassRunner.java:263)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.rules.ExternalResource$1.evaluate(ExternalResource.java:48)
at org.junit.rules.RunRules.evaluate(RunRules.java:20)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252)
at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141)
at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)
at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165)
at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)
at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115)
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75)
Caused by: org.postgresql.util.PSQLException: FATAL: remaining connection slots are reserved for non-replication superuser connections
at org.postgresql.core.v3.ConnectionFactoryImpl.readStartupMessages(ConnectionFactoryImpl.java:691)
at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:207)
at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:65)
at org.postgresql.jdbc2.AbstractJdbc2Connection.<init>(AbstractJdbc2Connection.java:149)
at org.postgresql.jdbc3.AbstractJdbc3Connection.<init>(AbstractJdbc3Connection.java:35)
at org.postgresql.jdbc3g.AbstractJdbc3gConnection.<init>(AbstractJdbc3gConnection.java:22)
at org.postgresql.jdbc4.AbstractJdbc4Connection.<init>(AbstractJdbc4Connection.java:47)
at org.postgresql.jdbc42.AbstractJdbc42Connection.<init>(AbstractJdbc42Connection.java:21)
at org.postgresql.jdbc42.Jdbc42Connection.<init>(Jdbc42Connection.java:28)
at org.postgresql.Driver.makeConnection(Driver.java:415)
at org.postgresql.Driver.connect(Driver.java:282)
at org.hibernate.engine.jdbc.connections.internal.DriverConnectionCreator.makeConnection(DriverConnectionCreator.java:38)
... 50 more

在我的本地机器上,我通过将最大连接数从 100 更改为 300 来解决这个问题,使我的所有测试都通过,但现在我想找到一个永久的解决方案,以防连接数变小 future 。还有其他项目将使用相同的远程数据库实例。

我用谷歌搜索了这个问题的解决方案,但找不到。要么没有,要么我问错了问题。谁能帮我解决这个问题?

谢谢。

最佳答案

Hw can I set up my DB connect to avoid tests failing due to maximum DB connection reached

当进行单元测试时,您没有连接到数据库。

模拟 执行实际数据库连接的类,并将它们配置为返回适合您的测试用例的明确定义的值。为此,您可以使用 Mockito 或类似的模拟框架。

UnitTest 还可以验证您自己的代码 的行为。您的测试验证连接到数据库的代码的行为,这看起来像您使用的某些框架。仅当您不信任该框架时才需要这样做,但如果它不值得信赖,那您为什么要使用它?

关于java - JUnit 测试 - 我可以设置我的数据库连接以避免测试由于达到最大数据库连接而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42818003/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com