1

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 に依存していると仮定すると、メモリ内データベースに基づいて実装を挿入するのも簡単です。

4

1 に答える 1

1

通常、セットアップ全体をテストすることはありません。Web レイヤーのテストを作成し、それらの永続レイヤーをモックします。サービス層と永続化層に対して個別のテストを記述します。

Web コントローラーをテストする場合は、ModelAndViewAssertまたはetcのモック バージョンを使用します。HttpServletRequest

一方、セットアップ全体をテストしたい場合は、HtmlUnit、Selenium などを使用して自動化された Web テストを実行しますが、実際にデプロイされたアプリ (もちろん非パブリック インストール) で実行します。

しかし、私の意見では、全体像をテストしたい場合は、実際のものをテストする必要があります. 大規模なモックは非常に面倒です。

于 2012-07-10T12:45:41.483 に答える