SpringBoot+MockMvcテストControllerノート整理
3653 ワード
基本フレームワーク:Springboot(バージョン情報:1.5.6.RELEASE)
環境情報:JDK 1.8
テストjarパッケージ:spring-boot-starter-test
以前他のプロジェクトでMockを用いたユニットテストを見たことがありますが、SpringMvc環境ではControllerに要求されたテストを直接シミュレートすることができ、よく使われるSping JunitやSpring TestNGなどよりも参考になる点があります.
本編では関連資料と結びつけてMockテストを行い、基本手順や注意点、分からない点についてメモをとり、後続の項目で出会ったら理解を深めることができます.
一、基本的なSpringBoot環境を構築した後、基本的に必要なjarパッケージを含み、テストクラスは直接生成したsrc/main/testディレクトリの下で新規作成することができる.
二、テスト例:
説明1:Spring 4.バージョン2以降、@SpringBootTest注記を元の注記に置き換えました.SpringMvcではxmlスキャンを構成してbeanを構築します.SpringBootでは起動クラスを構成するとすべてのbeanを構築できます.もちろん、この場所では使用するbeanのみを構成することもできます.
説明2:上記の方法は、すべてのControllerをテストする場合に適用する、一般的に単一のControllerをテストする場合に@SpringBootTest(classes={MockServiceServiceContext.class})を使用することを推奨し、MockMvcを構築する際にmockMvc=MockMvcBuildersを使用する.standaloneSetup(new UserController()).build(); 残りは、テストを要求するメソッドでサービスbeanを参照しない場合は可能ですが、サービスメソッド呼び出しに関連するメソッドではNullPonitException異常(@AutoWired注入beanは初期化されていません)が投げ出され、まだ解決策は見つかっていませんが、解決策もあると信じています
附1:単一コントローラテストの完全な例
附2:Mockテスト単一コントローラ
説明:テスト中にシミュレーションリクエストおよびパラメータが正しいことがわかりましたが、サービスレイヤのdaoレイヤのリファレンス呼び出しは実行されませんが、エラーは報告されません.
環境情報:JDK 1.8
テストjarパッケージ:spring-boot-starter-test
以前他のプロジェクトでMockを用いたユニットテストを見たことがありますが、SpringMvc環境ではControllerに要求されたテストを直接シミュレートすることができ、よく使われるSping JunitやSpring TestNGなどよりも参考になる点があります.
本編では関連資料と結びつけてMockテストを行い、基本手順や注意点、分からない点についてメモをとり、後続の項目で出会ったら理解を深めることができます.
一、基本的なSpringBoot環境を構築した後、基本的に必要なjarパッケージを含み、テストクラスは直接生成したsrc/main/testディレクトリの下で新規作成することができる.
二、テスト例:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = Application.class)
public class TestUserContorller {
private MockMvc mockMvc;
@Autowired
private WebApplicationContext webApplicationContext;
@Before
public void setUp() {
mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
}
@Test
public void testGetUser() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.get("/test/getUser.json").param("realName", "zhangsan")
.accept(MediaType.APPLICATION_JSON))
.andExpect(MockMvcResultMatchers.status().isOk())
.andDo(MockMvcResultHandlers.print())
.andReturn();
}
}
説明1:Spring 4.バージョン2以降、@SpringBootTest注記を元の注記に置き換えました.SpringMvcではxmlスキャンを構成してbeanを構築します.SpringBootでは起動クラスを構成するとすべてのbeanを構築できます.もちろん、この場所では使用するbeanのみを構成することもできます.
説明2:上記の方法は、すべてのControllerをテストする場合に適用する、一般的に単一のControllerをテストする場合に@SpringBootTest(classes={MockServiceServiceContext.class})を使用することを推奨し、MockMvcを構築する際にmockMvc=MockMvcBuildersを使用する.standaloneSetup(new UserController()).build(); 残りは、テストを要求するメソッドでサービスbeanを参照しない場合は可能ですが、サービスメソッド呼び出しに関連するメソッドではNullPonitException異常(@AutoWired注入beanは初期化されていません)が投げ出され、まだ解決策は見つかっていませんが、解決策もあると信じています
附1:単一コントローラテストの完全な例
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = {MockServletContext.class})
public class TestSimpleController {
private MockMvc mockMvc;
@Before
public void init() {
mockMvc = MockMvcBuilders.standaloneSetup(new UserController()).build();
}
@Test
public void testGetUser() throws Exception {
MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get("/test/kidding.json")
.accept(MediaType.APPLICATION_JSON))
.andExpect(MockMvcResultMatchers.status().isOk())
.andDo(MockMvcResultHandlers.print())
.andReturn();
System.out.println(result.getResponse().toString());
}
}
附2:Mockテスト単一コントローラ
public class TestSimpleController {
/**
* Mock
* Controller
*/
@InjectMocks
private UserController userController;
/**
* Mock
* Controller bean
*/
@Mock
private UserService userService;
private MockMvc mockMvc;
/**
* , mvc web
*/
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
this.mockMvc = MockMvcBuilders.standaloneSetup(userController).build();
}
@Test
public void testGetUser() throws Exception {
User user = new User();
Mockito.when(userService.getUserByRealName("zhangsan")).thenReturn(user);
Assert.assertNotNull(user);
this.mockMvc.perform(MockMvcRequestBuilders.get("/test/getUser.json").param("realName", "zhangsan")
.accept(MediaType.APPLICATION_JSON))
.andDo(MockMvcResultHandlers.print())
.andExpect(MockMvcResultMatchers.status().isOk())
.andReturn();
}
説明:テスト中にシミュレーションリクエストおよびパラメータが正しいことがわかりましたが、サービスレイヤのdaoレイヤのリファレンス呼び出しは実行されませんが、エラーは報告されません.