Springboot統合テスト-小例
19418 ワード
環境
MacBook Pro idea:2019.1 Java:1.8 springboot:2.1.4
前言
最近springboot
の実戦を見て、第4章 Web
-> springMVC
を見たとき、本の中について行くと、いつも問題が発生します.ここには次のように記録されています.@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(
classes = ReadingListApplication.class)
@WebAppConfiguration
public class MockMvcWebTests {
...
上は本の中の書き方ですが、私の環境では、間違いを報告します.①@SpringApplicationConfiguration
はspringboot1.5+
の時、すでに取り除かれているので、@SpringbootTest
を使うべきである.②@WebAppConfiguration
私はそれを@AutoConfigureMockMvc
に置き換えました.交換しないといつも間違っているからです.
ぶんせき
最初は次のように変更しました。
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ReadingListController.class)
@WebAppConfiguration
public class MockMvcWebTests {
...
エラーが表示されます.Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'readingListController': Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.misssad.springbootdemo.repository.ReadingListRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
この間違いは、コンストラクタが必要で、beanを作成することはできませんが、コードにはコンストラクタが注入され、そのコンストラクタがあることです.無参はできないし、無参は依然として間違っている.
およびCaused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.misssad.springbootdemo.repository.ReadingListRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
この間違いは、コンテキストにはReadingListRepository
というbean
はありません.ReadingListController
類にはReadingListRepository
が依存しているからです.しかし、このシミュレータはReadingListController
しかロードされていません.その依存bean
はロードされていません.
次のように変更します。
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ReadingListController.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@WebAppConfiguration
public class MockMvcWebTests {
...
エラー:java.lang.IllegalStateException: @WebAppConfiguration should only be used with @SpringBootTest when @SpringBootTest is configured with a mock web environment. Please remove @WebAppConfiguration or reconfigure @SpringBootTest
この段落は私が理解していないので、その大まかな意味:
@SpringBootTestが仮想Web環境を構成している場合、@WebAppConfigurationは@SpringBootTestとのみ使用できます.@WebAppConfigurationを削除するか、@SpringBootTestを再構成してください
Web環境なのに、どうしてこの間違いを報告したのか、今のところ分からないの??
次に次のように変更しました。
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ReadingListController.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
public class MockMvcWebTests {
...
このようなエラーを報告しました.Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean
つまりServlet
という容器bean
は見つかりませんでした.
最後に、@SpringBootTest
のclasses
パラメータを削除すればいいです.つまり、最終コードです.
最終コード
最終コードは(関連コードは貼らないで、springboot .pdf
のあちらの本を参考にしています)import com.misssad.springbootdemo.controller.ReadingListController;
import org.hamcrest.Matchers;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
import javax.annotation.Resource;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
public class MockMvcWebTests {
@Autowired
private WebApplicationContext webContext;
private MockMvc mockMvc;
/* MockMvc
,
*/
@Before
public void setupMockMvc(){
mockMvc = MockMvcBuilders.webAppContextSetup(webContext)
.build();
System.out.println("------- ------");
}
/*① readingList get ;
* ② (isOK() HTTP200 );
* ③ readingList;
* ④ books
* ⑤
*/
@Test
public void homePage() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.get("/readingList"))
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.view().name("readList"))
.andExpect(MockMvcResultMatchers.model().attributeExists("books"))
.andExpect(MockMvcResultMatchers.model()
.attribute("books", Matchers.is(Matchers.empty())));
}
}
参照先:
https://stackoverflow.com/a/42788074Spring Boot統合テスト
最近
springboot
の実戦を見て、第4章 Web
-> springMVC
を見たとき、本の中について行くと、いつも問題が発生します.ここには次のように記録されています.@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(
classes = ReadingListApplication.class)
@WebAppConfiguration
public class MockMvcWebTests {
...
上は本の中の書き方ですが、私の環境では、間違いを報告します.①
@SpringApplicationConfiguration
はspringboot1.5+
の時、すでに取り除かれているので、@SpringbootTest
を使うべきである.②@WebAppConfiguration
私はそれを@AutoConfigureMockMvc
に置き換えました.交換しないといつも間違っているからです.ぶんせき
最初は次のように変更しました。
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ReadingListController.class)
@WebAppConfiguration
public class MockMvcWebTests {
...
エラーが表示されます.Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'readingListController': Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.misssad.springbootdemo.repository.ReadingListRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
この間違いは、コンストラクタが必要で、beanを作成することはできませんが、コードにはコンストラクタが注入され、そのコンストラクタがあることです.無参はできないし、無参は依然として間違っている.
およびCaused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.misssad.springbootdemo.repository.ReadingListRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
この間違いは、コンテキストにはReadingListRepository
というbean
はありません.ReadingListController
類にはReadingListRepository
が依存しているからです.しかし、このシミュレータはReadingListController
しかロードされていません.その依存bean
はロードされていません.
次のように変更します。
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ReadingListController.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@WebAppConfiguration
public class MockMvcWebTests {
...
エラー:java.lang.IllegalStateException: @WebAppConfiguration should only be used with @SpringBootTest when @SpringBootTest is configured with a mock web environment. Please remove @WebAppConfiguration or reconfigure @SpringBootTest
この段落は私が理解していないので、その大まかな意味:
@SpringBootTestが仮想Web環境を構成している場合、@WebAppConfigurationは@SpringBootTestとのみ使用できます.@WebAppConfigurationを削除するか、@SpringBootTestを再構成してください
Web環境なのに、どうしてこの間違いを報告したのか、今のところ分からないの??
次に次のように変更しました。
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ReadingListController.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
public class MockMvcWebTests {
...
このようなエラーを報告しました.Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean
つまりServlet
という容器bean
は見つかりませんでした.
最後に、@SpringBootTest
のclasses
パラメータを削除すればいいです.つまり、最終コードです.
最終コード
最終コードは(関連コードは貼らないで、springboot .pdf
のあちらの本を参考にしています)import com.misssad.springbootdemo.controller.ReadingListController;
import org.hamcrest.Matchers;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
import javax.annotation.Resource;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
public class MockMvcWebTests {
@Autowired
private WebApplicationContext webContext;
private MockMvc mockMvc;
/* MockMvc
,
*/
@Before
public void setupMockMvc(){
mockMvc = MockMvcBuilders.webAppContextSetup(webContext)
.build();
System.out.println("------- ------");
}
/*① readingList get ;
* ② (isOK() HTTP200 );
* ③ readingList;
* ④ books
* ⑤
*/
@Test
public void homePage() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.get("/readingList"))
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.view().name("readList"))
.andExpect(MockMvcResultMatchers.model().attributeExists("books"))
.andExpect(MockMvcResultMatchers.model()
.attribute("books", Matchers.is(Matchers.empty())));
}
}
参照先:
https://stackoverflow.com/a/42788074Spring Boot統合テスト
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ReadingListController.class)
@WebAppConfiguration
public class MockMvcWebTests {
...
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'readingListController': Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.misssad.springbootdemo.repository.ReadingListRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.misssad.springbootdemo.repository.ReadingListRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ReadingListController.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@WebAppConfiguration
public class MockMvcWebTests {
...
java.lang.IllegalStateException: @WebAppConfiguration should only be used with @SpringBootTest when @SpringBootTest is configured with a mock web environment. Please remove @WebAppConfiguration or reconfigure @SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ReadingListController.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
public class MockMvcWebTests {
...
Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean
最終コードは(関連コードは貼らないで、
springboot .pdf
のあちらの本を参考にしています)import com.misssad.springbootdemo.controller.ReadingListController;
import org.hamcrest.Matchers;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
import javax.annotation.Resource;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
public class MockMvcWebTests {
@Autowired
private WebApplicationContext webContext;
private MockMvc mockMvc;
/* MockMvc
,
*/
@Before
public void setupMockMvc(){
mockMvc = MockMvcBuilders.webAppContextSetup(webContext)
.build();
System.out.println("------- ------");
}
/*① readingList get ;
* ② (isOK() HTTP200 );
* ③ readingList;
* ④ books
* ⑤
*/
@Test
public void homePage() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.get("/readingList"))
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.view().name("readList"))
.andExpect(MockMvcResultMatchers.model().attributeExists("books"))
.andExpect(MockMvcResultMatchers.model()
.attribute("books", Matchers.is(Matchers.empty())));
}
}
参照先:
https://stackoverflow.com/a/42788074Spring Boot統合テスト