Trả lời

38

Cấu hình mùa xuân có thể được sử dụng cho việc này. Đây sẽ là một cách cụ thể:

Có môi trường thuộc tính tập tin cụ thể:

application.properties:

spring.profiles.active: dev 

application-dev.properties

spring.jpa.database: MYSQL 
spring.jpa.hibernate.ddl-auto: update 

spring.datasource.url: jdbc:mysql://localhost:3306/dbname 
spring.datasource.username: username 
spring.datasource.password: password 

ứng dụng -test.properties

spring.jpa.database: HSQL 

Có cả MySQLtrình điều khiển H2 trong pom.xml, như thế này:

<dependency> 
    <groupId>mysql</groupId> 
    <artifactId>mysql-connector-java</artifactId> 
    <scope>runtime</scope> 
</dependency> 

<dependency> 
    <groupId>org.hsqldb</groupId> 
    <artifactId>hsqldb</artifactId> 
    <scope>test</scope> 
</dependency> 

Cuối cùng nhưng không kém phần chú thích các lớp học thử nghiệm với @ActiveProfiles("test").

+0

Hồ sơ 'dev' có vẻ kỳ lạ đối với tôi. Đó không phải là sản phẩm "sản xuất" sao? Trong trường hợp này, chỉ cần đặt thông tin đó trong 'application.properties', không cần' spring.profiles.active'. –

+0

Tôi có một hồ sơ 'prod' riêng biệt. Nếu chúng ta đặt thông tin 'dev' trong * application.properties *, thì thông tin đó có bị rò rỉ cho cấu hình' test' không? – Sanjay

+0

Tất cả những gì tôi nói là bạn không trả lời câu hỏi. Dev/kiểm tra là khó hiểu trong câu trả lời của bạn. Tôi mong đợi một hồ sơ sản xuất và sau đó là một hồ sơ thử nghiệm nhưng không phải là một "Dev" một. Bạn cũng có thể có một "prod" hồ sơ với sản xuất và để lại mặc định cho thử nghiệm. Vì Spring Boot không tìm thấy bất kỳ thông tin cụ thể nào, nó sẽ sử dụng vùng chứa được nhúng. –

3

@Sanjay có một cách để đặt nó nhưng tôi thấy nó khó hiểu. Bạn cũng chỉ có thể có tiểu sử production mà bạn bật khi bạn đang ở trong quá trình sản xuất, chẳng hạn như:

spring.jpa.hibernate.ddl-auto: update 
spring.datasource.url: jdbc:mysql://localhost:3306/dbname 
spring.datasource.username: username 
spring.datasource.password: password 

Và không chỉ định bất cứ điều gì khác. Nếu bạn thêm một cơ sở dữ liệu nhúng trong phạm vi test, nó sẽ có sẵn trong các thử nghiệm của bạn. Nếu bạn chạy thử nghiệm với cấu hình mặc định (không có tùy chỉnh), nó sẽ không tìm thấy bất kỳ thông tin cơ sở dữ liệu nào (vì chúng được lưu trữ trong cấu hình production). Trong trường hợp đó, nó sẽ cố gắng tìm một cơ sở dữ liệu nhúng và khởi động nó cho bạn. Nếu bạn cần tùy biến hơn đối với một số lý do, bạn có thể có một application-test.properties cho những người (bạn sẽ cần phải thêm ActiveProfiles("test") để thử nghiệm của bạn (s)

+1

Trong các trường hợp của tôi, tôi sẽ có cơ sở dữ liệu MySQL trong máy tính của mình, nó sẽ được sử dụng khi chạy ứng dụng cục bộ trong khi phát triển. Đó là lý do tại sao tôi nghĩ chúng tôi cần một hồ sơ 'dev' để chạy ứng dụng và một hồ sơ' test' để chạy các kiểm tra thông qua IDE của tôi. Bất kỳ đơn giản hóa có thể được thực hiện trong trường hợp này? – Sanjay

+0

Chỉ cần thêm 'application-dev.properties' với MySQL DB của bạn và kích hoạt hồ sơ' dev' khi bạn chạy ứng dụng từ IDE của bạn. –

+0

Được rồi, những gì tôi hiểu là câu trả lời của tôi ở trên trông suiting trường hợp này, ngoại trừ việc tôi có thể bỏ qua hồ sơ 'test' và' @ ActiveProfile' nếu cấu hình 'test' không có gì ngoại trừ DB. Hãy cho tôi biết nếu điều này nghe có vẻ sai. – Sanjay

3

giải pháp đơn giản nếu xây dựng với maven:. Chỉ cần đặt một tập tin application.properties dưới src/test/resources

Cơ chế hồ sơ Spring (Khởi động) là một công cụ khá mạnh mẽ, trong phạm vi, đi xa hơn "thiết lập trao đổi giữa thời gian thử nghiệm và thời gian chạy" Mặc dù, rõ ràng, như được minh chứng, nó có thể làm điều đó cũng :)

17

Cách tiếp cận khác là thêm chú thích @AutoConfigureTestDatabase để bạn kiểm tra lớp học. kiểm tra của tôi thường trông như thế này:

@RunWith(SpringRunner.class) 
@DataJpaTest 
@AutoConfigureTestDatabase(connection = EmbeddedDatabaseConnection.H2) 
public class MyRepositoryTest { 

    @Autowired 
    MyRepository repository; 

    @Test 
    public void test() throws Exception { 
     // Tests... 
    } 
} 
1

đơn giản nhất giải pháp:

1) trong src/main/nguồn lực có application.properties (sản xuất config):

spring.datasource.url=jdbc:mysql://localhost:3306/somedb 
spring.datasource.username=root 
spring.datasource.password=password 
spring.datasource.driverClassName=com.mysql.jdbc.Driver 
spring.jpa.database-platform = org.hibernate.dialect.MySQL5Dialect 

và ứng dụng thử nghiệm .các thuộc tính có cấu hình HSQL như:

spring.jpa.hibernate.ddl-auto = create-drop 
spring.jpa.database = HSQL 
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.HSQLDialect 
spring.datasource.driverClassName = org.hsqldb.jdbcDriver 
spring.datasource.url: jdbc:hsqldb:mem:scratchdb 
spring.datasource.username = sa 
spring.datasource.password = 

2) Thêm phụ thuộc HSQL vào pom.xml nếu bạn chưa có.

3) Chú thích lớp thử nghiệm của bạn bằng @ActiveProfiles ("test").

Làm việc như sự quyến rũ trong trường hợp của tôi.

+0

Hey, làm thế nào để bạn thiết lập hsql chính nó? –

+0

Xin chào @AlexBondar. Bạn có thể sử dụng mẫu trước nó nhưng bạn có thể sử dụng thay thế = Replace.NONE bên trong AutoConfigureTestDatabase – bpedroso

Các vấn đề liên quan