У меня есть простое маленькое приложение Spring Boot "Hello World". Он имеет одну сущность («IssueReport») и настроен на запуск mySQL (вместо встроенной базы данных H2 по умолчанию).
Само приложение работает нормально. Я создал базу данных и пользователя mySql, Spring Boot / Hibernate создал таблицу и успешно заполняет и считывает данные mySQL при запуске приложения. Жизнь хороша - проблем с mySQL и моим приложением Spring Boot нет.
Q: Теперь, как мне использовать mySQL (вместо встроенного H2) в модульных тестах?
Я создал вторую отдельную базу данных MySQL: test2_test_db
.
Я использую Spring Boot 2.0.6; Затмение Фотон на СТС 3.9.6; Ubuntu Linux.
Я создал application-test.properties
в src/test/resources/
:
spring.datasource.url=jdbc:mysql://localhost:3306/test2_test_db
spring.datasource.username=springuser
spring.datasource.password=springuser
spring.jpa.hibernate.ddl-auto=create
Вот весь модульный тест:
package com.hellospring.example;
import static org.assertj.core.api.Assertions.assertThat;
import java.util.List;
import javax.transaction.Transactional;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringRunner;
import com.hellospring.example.entity.IssueReport;
import com.hellospring.example.repositories.IssueRepository;
@RunWith(SpringRunner.class)
@ActiveProfiles("test")
@Transactional
@DataJpaTest
public class IssueRepositoryIntegrationTests {
@Autowired
private TestEntityManager entityManager;
@Autowired
private IssueRepository issueRepository;
@Test
public void addNewIssue() {
System.out.println("addNewIssue()..."); // <-- This prints in the console
final String email = "test@test.io";
List<IssueReport> resultSet = issueRepository.findAll(); // <-- We get an exception in here...
}
}
Вот ошибка консоли:
2018-10-25 22:20:16.381 INFO 13637 --- [ main] c.v.e.IssueRepositoryIntegrationTests : The following profiles are active: test
2018-10-25 22:20:16.405 INFO 13637 --- [ main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@d554c5f: startup date [Thu Oct 25 22:20:16 PDT 2018]; root of context hierarchy
2018-10-25 22:20:17.059 INFO 13637 --- [ main] beddedDataSourceBeanFactoryPostProcessor : Replacing 'dataSource' DataSource bean with embedded version
2018-10-25 22:20:17.060 INFO 13637 --- [ main] o.s.b.f.s.DefaultListableBeanFactory : Overriding bean definition for bean 'dataSource' with a different definition: replacing [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration$Hikari; factoryMethodName=dataSource; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]] with [Root bean: class [org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration$EmbeddedDataSourceFactoryBean]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null]
2018-10-25 22:20:17.308 INFO 13637 --- [ main] o.s.j.d.e.EmbeddedDatabaseFactory : Starting embedded database: url='jdbc:h2:mem:979b3ce9-604e-4efd-a6d4-79576c3d67e9;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa'
2018-10-25 22:20:17.685 INFO 13637 --- [ main] j.LocalContainerEntityManagerFactoryBean : Building JPA container EntityManagerFactory for persistence unit 'default'
... <= I do *NOT* want H2! I want mySQL!
2018-10-25 22:20:19.315 WARN 13637 --- [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 42102, SQLState: 42S02
2018-10-25 22:20:19.316 ERROR 13637 --- [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : Table "ISSUE_REPORT" not found; SQL statement:
... <= Here's the exception from running the test...
В: Какое самое простое изменение, чтобы я мог запускать свои модульные тесты с mySQL так же, как я могу запускать свое приложение Spring Boot с mySQL?
Q: "@DataJpaTest" - лучший выбор здесь, или я должен попробовать другую аннотацию?
В: Должен ли я создать отдельный класс "Бин"? Если да, можете ли вы указать на пример?
=============================================== =================
Спасибо за все ваши ответы. Включая ответ Саймона Мартинелли (теперь удаленный).
РЕШЕНИЕ:
Мой оригинал application-test.properties
был в порядке как есть.
Я поставил его не туда: все файлы application.properties для любого профиля обычно должны находиться в одной папке проекта: src/main/resources
<= ПРИМЕР: <code>src/main/resources/application-test.properties
@Transactional
здесь не актуально - я его убрал. Я сохранил это @ActiveProfiles("test")
.
В соответствии с предложением Картика R, я добавил @AutoConfigureTestDatabase(replace=Replace.NONE)
.
В этот момент тест успешно прочитал application-test.properties
и использовал MySQL вместо H2.
Финальные аннотации:
@RunWith(SpringRunner.class)
@ActiveProfiles("test")
@DataJpaTest
@AutoConfigureTestDatabase(replace=Replace.NONE)
public class IssueRepositoryIntegrationTests {
Я нашел эту ссылку особенно полезной: Spring Boot - Свойства на основе профиля и пример yaml
<= Я всегда находил все материалы на <a href="http://www.mkyong.com" rel="nofollow noreferrer">http://www.mkyong.com очень хорошими!