SpringブートRESTコントローラーのテストを書いています。このレストコントローラーは、いくつかの値をデータベースに書き込みます。
Springがこのテスト用に提供しているインメモリデータベースを使用したいと思います。 this doc によると、テストクラスに_@DataJpaTest
_の注釈を付ける必要があります。これにより、次のエラーが発生します。
_Java.lang.IllegalStateException: Failed to load ApplicationContext
_
エラースタックトレースのさらに下に、次の例外がスローされたことがわかります。
_Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration': Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource': Invocation of init method failed; nested exception is Java.lang.IllegalStateException: Failed to replace DataSource with an embedded database for tests. If you want an embedded database please put a supported one on the classpath or tune the replace attribute of @AutoconfigureTestDatabase.
_
これは私が取り組んでいるテストクラスです:
_@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
@DataJpaTest
public class AuthenticationControllerFTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private AuthenticationManager authenticationManager;
@Autowired
private WebApplicationContext context;
@Autowired
private Filter springSecurityFilterChain;
@Before
public void setup() {
mockMvc = MockMvcBuilders.webAppContextSetup(context)
.addFilters(springSecurityFilterChain).build();
}
@Test
public void testCreate() throws Exception {
String exampleUserInfo = "{\"name\":\"Salam12333\",\"username\":\"[email protected]\",\"password\":\"Salam12345\"}";
RequestBuilder requestBuilder = MockMvcRequestBuilders
.post("/signup")
.accept(MediaType.APPLICATION_JSON).content(exampleUserInfo)
.contentType(MediaType.APPLICATION_JSON);
MvcResult result = mockMvc.perform(requestBuilder).andReturn();
MockHttpServletResponse response = result.getResponse();
int status = response.getStatus();
Assert.assertEquals("http response status is wrong", 200, status);
}
}
_
このエラーの原因は何ですか?
編集1これは私の_application.properties
_の内容です:
_spring.datasource.username = hello
spring.datasource.password = hello
spring.datasource.driver-class-name= com.mysql.jdbc.Driver
spring.datasource.url = jdbc:mysql://localhost:3306/myproject?useSSL=false
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type=TRACE
logging.level.org.springframework.web=DEBUG
server.port = 8443
server.ssl.key-store = classpath:Tomcat.keystore
server.ssl.key-store-password = hello
server.ssl.key-password = hello
server.ssl.enabled = true
server.ssl.key-alias=myproject
_
編集2
_pom.xml
_に以下を追加しました。
_<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<scope>test</scope>
</dependency>
_
次の内容で_application-test.properties
_を作成しました。
_spring.datasource.username= root
spring.datasource.password= password
spring.datasource.driver-class-name= org.h2.Driver
spring.datasource.url= jdbc:h2:mem:db;DB_CLOSE_DELAY=-1
_
@ActiveProfiles("test")
を追加しました。テストを実行すると、次の行を含むエラーが発生します。_Caused by: org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set
_
自動構成を有効にする_@SpringBootApplication
_でクラスに注釈を付け、クラスパスに_H2
_依存関係があると仮定します(以下を参照)_Spring Boot
_は_H2
_インメモリデータベース依存関係と_javax.sql.DataSource
_実装を作成します。デフォルトの接続URLは_jdbc:h2:mem:testdb
_で、デフォルトのユーザー名とパスワードは次のとおりです。ユーザー名:saおよびパスワード:空。
application.propertiesファイル
_spring.datasource.url=jdbc:h2:mem:tesdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.testWhileIdle = true
spring.datasource.validationQuery = SELECT 1
spring.jpa.show-sql = true
spring.h2.console.enabled=true // if you need console
_
H2依存性
_ <dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency> // If you need h2 web console
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
_
管理用のh2コンソールにアクセスできます_http://localhost:8080/h2-console
_
インメモリDBを使用したRESTサービスのテストでは、次のことを行う必要があります。
1。 pom.xmlにh2依存関係を追加します
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
2.application.propertiesまたはapplication.yamlでh2構成を定義します
spring.jpa.database = h2
spring.datasource.url=jdbc:hsqldb:mem:testdb
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.HSQLDialect
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=create
3.テストクラスに注釈を付けます
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
完全なコードは次のようになります。
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class AuthenticationControllerFTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private AuthenticationManager authenticationManager;
@Autowired
private WebApplicationContext context;
@Autowired
private Filter springSecurityFilterChain;
@Before
public void setup() {
mockMvc = MockMvcBuilders.webAppContextSetup(context)
.addFilters(springSecurityFilterChain).build();
}
@Test
public void testCreate() throws Exception {
String exampleUserInfo = "{\"name\":\"Salam12333\",\"username\":\"[email protected]\",\"password\":\"Salam12345\"}";
RequestBuilder requestBuilder = MockMvcRequestBuilders
.post("/signup")
.accept(MediaType.APPLICATION_JSON).content(exampleUserInfo)
.contentType(MediaType.APPLICATION_JSON);
MvcResult result = mockMvc.perform(requestBuilder).andReturn();
MockHttpServletResponse response = result.getResponse();
int status = response.getStatus();
Assert.assertEquals("http response status is wrong", 200, status);
}
}
Spring Bootでは、クラスパスのjarファイルとクラスパスのアプリケーションプロパティファイル(application.properties
)(mavenを使用する場合はsrc/test/resources
)を除いて、インメモリデータベース構成に追加する必要はありません。残りはスプリングブーツ(ブーツの美しさ)でお世話になります。
別のオプションは、クラスパスsrc/amin/resources
にプロファイル固有のプロパティファイルを提供することです(たとえば、application-test.properties
)
両方のファイルがテスト構成に有効です
プロパティファイルの設定例を以下に示します(クラスパス上のHSQL DB jarを検討してください)。
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 = pass
@AutoConfigureMockMvcと@DataJpaTestの両方のアノテーションを削除します。完全なアプリケーションをテストしようとしているので、@ SpringBootTestアノテーションが必要です。 @DataJpaTestは、データアプリケーションスライスのみをテストする場合にのみ必要です。これを見てください: https://spring.io/blog/2016/04/15/testing-improvements-in-spring-boot-1-4
多分これは役に立ちます。
spring.datasource.url=jdbc:hsqldb:mem:testdb
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.HSQLDialect
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=create