単体テストと統合テストを行いたいSpring MVC 3.2プロジェクトがあります。問題は、私が持っているすべての依存関係であり、Sprint-test でもテストが非常に困難になります。
次のようなコントローラーがあります。
@Controller
@RequestMapping( "/" )
public class HomeController {
@Autowired
MenuService menuService; // will return JSON
@Autowired
OfficeService officeService;
@RequestMapping( method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE )
@ResponseBody
public AuthenticatedUser rootCall( HttpServletRequest request ) {
AuthenticatedUser authentic = new AuthenticatedUser();
Office office = officeService.findByURL(request.getServerName());
authentic.setOffice(office);
// set the user role to authorized so they can navigate the site
menuService.updateVisitorWithMenu(authentic);
return returnValue;
}
これにより、JSON オブジェクトが返されます。この呼び出しが 200 を返し、既定の JSON を使用して正しいオブジェクトを返すことをテストしたいと思います。ただし、これらの @Autowired クラスによって呼び出される他の多くのクラスがあり、次のようにそれらをモックしたとしても:
@Bean public MenuRepository menuRepository() {
return Mockito.mock(MenuRepository.class);
}
これにより、多くのモッククラスが作成されます。これが私がそれをテストしようとしている方法です:
@RunWith( SpringJUnit4ClassRunner.class )
@ContextConfiguration( classes = JpaTestConfig.class )
@WebAppConfiguration
public class HomeControllerTest {
private EmbeddedDatabase database;
@Resource
private WebApplicationContext webApplicationContext;
@Autowired
OfficeService officeService;
private MockMvc mockMvc;
@Test
public void testRoot() throws Exception { mockMvc.perform(get("/")).andDo(print()).andExpect(status().isOk())
.andExpect(content().contentType(IntegrationTestUtil.APPLICATION_JSON_UTF8))
.andExpect(content().string(<I would like canned data here>));
}
H2組み込みデータベースをセットアップしてデータを入力することはできますが、それは本当にこのコントローラーまたはアプリケーションのテストなのだろうか? この統合テストへのより良いアプローチを推奨できる人はいますか? コントローラーの単体テストを作成するにはどうすればよいですか?
ありがとうございました!