DAO 経由で Hibernate JPA 経由で MySql を使用する Spring 3.1 Web mvc アプリケーションを想像してみましょう。
アプリケーションをデプロイせずに、インメモリデータベースを使用せずに、コントローラーのテストを作成する必要があります (hsqldb:mem
たとえば)。つまり、ローカル PC でテストを実行できる必要があります。
これはどのように達成できますか?そのようなコントローラーのテストを作成する方法の詳細な例を誰かが提供できますか? どの@ContextConfiguration
ように構成する必要がありますか? WebApplicationContext
ローカルでテスト目的でを取得する方法は? を維持する必要がありhibernate-test.cfg.xml
ますか?
アップデート
単体テストについて話しているのではなく、統合テストについて話しているのです。
解決
ショーン・パトリック・フロイドの回答に加えてこれを完全にするために、ここからインスピレーションを得たソリューションを次に示します。
サービス例:
public interface MarkingService {
public String markItem(String item);
}
サービスを利用したコントローラーの例
@Controller
public class TestableController {
@Autowired
private MarkingService markerService;
@RequestMapping(value = "mark/{name}")
public String mark(Model ui, @PathVariable String name){
String value = this.markerService.markItem(name);
ui.addAttribute("mark-value", value);
return "mark-show";
}
}
コントローラーをテストするためのサービスのモック:
public class MarkingServiceMock implements MarkingService {
@Override
public String markItem(String item) {
return "mockValue";
}
}
テスト構成の構成オブジェクト:
@Configuration
public class TestableControllerConfig {
// We return a mock to test the controller layer
@Bean
public MarkingService markingService() {
return new MarkingServiceMock();
}
}
コントローラーのテスト:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes={TestableControllerConfig.class})
public class TestableControllerTest {
// Will be injected with TestableControllerConfig.markingService()
@Autowired
private MarkingService markerService;
@Test
public void testController() {
// ...
}
}
サービス層が DAO に依存していると仮定すると、メモリ内データベースに基づいて実装を挿入するのも簡単です。