如何解决春季测试希望连接到数据库
我正在尝试为我的应用程序编写一些测试,并且遇到以下问题: 我定义了具有以下内容的application-test.yml:
server:
port: 8085
spring:
security:
oauth2:
resourceserver:
jwt:
# change localhost:8081 with container name
issuer-uri: http://localhost:8081/auth/realms/drivingschool
jwk-set-uri: http://localhost:8081/auth/realms/drivingschool/protocol/openid-connect/certs
keycloak:
realm: drivingschool
auth-server-url: http://localhost:8081/auth
ssl-required: external
resource: client-interface
use-resource-role-mappings: true
credentials:
secret: xxx
bearer-only: true
我的考试班:
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
@ActiveProfiles("test")
public class StudentControllerTests {
@Autowired
private MockMvc mockMvc;
@Autowired
private StudentService service;
@MockBean
private StudentRepository repository;
@Test
public void contextLoads(){}
//more tests
}
该测试在我看到的日志中全部通过绿色BUT,但我的应用程序尝试连接到在我的(基本)应用程序中配置的数据库。yml。
ava.sql.SQLNonTransientConnectionException: Could not connect to address=(host=localhost)(port=9005)(type=master) : Socket fail to connect to host:localhost,port:9005. Verbindungsaufbau abgelehnt (Connection refused)
at org.mariadb.jdbc.internal.util.exceptions.ExceptionFactory.createException(ExceptionFactory.java:73) ~[mariadb-java-client-2.6.1.jar:na]
at org.mariadb.jdbc.internal.util.exceptions.ExceptionFactory.create(ExceptionFactory.java:192) ~[mariadb-java-client-2.6.1.jar:na]
jpa:
database-platform: org.hibernate.dialect.MariaDBDialect
hibernate:
use-new-id-generator-mappings: false
ddl-auto: create
datasource:
url: jdbc:mariadb://localhost:9005/waterloo
username: waterloo
password: xxx
driver-class-name: org.mariadb.jdbc.Driver
在创建application-prod.yml并将所有内容从application.yml移至application-prod.yml时,它告诉我必须配置数据源URL
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaConfiguration': Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is org.springframework.boot.autoconfigure.jdbc.DataSourceProperties$DataSourceBeanCreationException: Failed to determine a suitable driver class
我有以下问题:
- application.yml文件是否分层(在application.yml顶部为* -test.yml设置)?
- 当我未在application-test.yml上设置数据源并在测试中模拟存储库时,为什么Spring会尝试建立与数据库的连接?
- Spring尝试在此部分建立连接是否正常? 3.1)如果不是:我如何防止这样做?
谢谢和亲切的问候!
解决方法
无法确定合适的驱动程序类别
您需要在gradle或maven文件中添加mariadb驱动程序依赖项。
https://mvnrepository.com/artifact/org.mariadb.jdbc/mariadb-java-client/2.6.2
确保依赖范围适用于测试
如果您已经拥有并且仍然无法正常工作,请尝试清理并重建您的项目。
您的问题:
将application.yml文件分层(* -test.yml设置在顶部) of application.yml)?
如果您将@ActiveProfiles("test")
添加到您的TestClass中,Spring将尝试查找application-test.yml应用程序并覆盖具有给定属性的application.yml属性。
为什么我不在时Spring为什么尝试建立与数据库的连接 在我的application-test.yml上设置数据源并模拟 测试中的存储库?
那是Spring Boot的魔力-它具有所有功能的默认配置。您只需要设置Datasource属性,它将自行创建Bean。
Spring尝试在此部分建立连接是否正常? 3.1)如果不是:我如何防止这样做?
您将使用@SpringBootTest Annotation开始整个spring上下文。 因此它将启动所有存储库并尝试建立与数据库的连接。如果您不希望Spring启动数据库层,则可以使用@WebMvcTest
例如:
@RunWith(SpringRunner.class)
@WebMvcTest
@ActiveProfiles("test")
public class StudentControllerTests {
@Autowired
private MockMvc mockMvc;
@Test
public void contextLoads(){}
//more tests
}
查看以下内容:https://spring.io/guides/gs/testing-web/
如果您需要启动整个SpringContext,还可以使用以下命令禁用Spring Data AutoConfiguration:
@SpringBootApplication(exclude = {
DataSourceAutoConfiguration.class,DataSourceTransactionManagerAutoConfiguration.class,HibernateJpaAutoConfiguration.class
})
查看以下内容:https://www.baeldung.com/spring-data-disable-auto-config
,缺少以下注释:
final AlertDialog.Builder saveDialog = new AlertDialog.Builder(this);
save.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
if (view.getId() == R.id.savebtn) {
saveDialog.setTitle("Save Drawing");
saveDialog.setMessage("Save drawing to Gallery");
saveDialog.setPositiveButton("Yes",new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface,int i) {
drawableView.setDrawingCacheEnabled(true);
String insertImage = MediaStore.Images.Media.insertImage(MainActivity.this.getContentResolver(),drawableView.getDrawingCache(),UUID.randomUUID().toString() + ".png","drawing");
if (insertImage!= null) {
Toast savedtoast = Toast.makeText(getApplicationContext(),"Drawing Saved to gallery!",Toast.LENGTH_SHORT);
savedtoast.show();
} else {
Toast unsaved = Toast.makeText(getApplicationContext(),"Drawing not saved!",Toast.LENGTH_SHORT);
unsaved.show();
}
drawableView.destroyDrawingCache();
}
});
saveDialog.setNegativeButton("No",int i) {
dialogInterface.cancel();
}
});
saveDialog.show();
}
}
});
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。