1

クラスを単体テストし、DAO をモックして予測可能な結果を​​提供しようとしています。それでも、休止状態エラーを受け取ると、DAO のメソッドがまだ呼び出されているように見えます。

org.hibernate.exception.GenericJDBCException: ステーション TST が見つかりません。

このエラーは、データベースに TST が含まれていないことが原因ですが、DAO をモックしたため、これを呼び出すべきではありませんか? データベースがヒットしないように呼び出しをモックするにはどうすればよいですか。

モックを設定する方法は次のとおりです

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:applicationContext.xml" })
public class MyServiceTest{

    @Autowired
    private MyService service;

    private MyDAO dao;

    private LinkedList objs;    


    @Before
    public void init() throws SecurityException, NoSuchFieldException,
            IllegalArgumentException, IllegalAccessException {


        // mock the dao for predictable results
        dao = mock(MyDAO.class);

        when(dao.myDBCall(anyString(), any(Date.class))).thenReturn(legs);
        Field f = MyService.class.getDeclaredField("dao");
        f.setAccessible(true);
        f.set(service, dao);


    }

    @Test
    public void testCall() {
        // construct our sample leg data
        legs = new LinkedList();
//fill in my stub data i want to return

        Collections.shuffle(legs);

        List results = service.testingCall("TST", new Date()); // this fails because service is using the dao, but it is making a call to the DB with this garbage 'Test' param rather than just returning 'legs' as stated in my when clause
        assertThat(results, not(nullValue()));


    }

    @Test
    public void testGetGates() {
        // fail("Not yet implemented");
    }

    @Test
    public void testGetStations() {
        // fail("Not yet implemented");
    }
}
4

2 に答える 2

2

あなたServiceは春によってインスタンス化され、Dao定義されたものapplication-context.xmlであり、サービスにモックを挿入しようとする前にエラーが発生すると思います。

サービスをテストするために使用したいものの 1 つはAutowiredコンストラクターです。テストでは、Spring でサービスをインスタンス化するのではなく、コンストラクターとモックを使用します。

private MyDao myDao;

@Autowired
public MyService(MyDao myDao){
this.myDao = myDao;
}

そして、あなたのテストで:

MyService myService = new Myservice(mockedDao);
于 2013-03-13T22:19:06.747 に答える
1

まず、PowerMockField f = MyService.class.getDeclaredField("dao");をチェックする代わりに(をチェック)Whitebox

1 つのオブジェクトをモックしても、休止状態の開始が妨げられることはありません ( をロードapplicationContext.xmlしているため、休止状態は DB に接続しようとします)。あなたのモック - これは、1 つのテスト インスタンスの 1 つのフィールドにある単なる POJO であり、Spring Bean やクラスの置換ではありません。

dao とサービス クラスのみをテストする (明確な単体テストを作成する) 場合は、Spring 関連の注釈をテストから削除し、自分で実行します (モックを作成し、サービスを作成し、モックをサービスに配置してテストします)。

Spring コンテキストでアプリケーションをテストする (統合テストを作成する) 場合は、休止状態用の H2 インメモリ データベースを作成し、サービスをテストするだけです (でそれをクリアすることを忘れないでください@After)。

3 番目の方法 - 構成ファイルを 2 つの Spring プロファイル (たとえばdevtest) に分割し、モックを自分で実装します (モックを にtest、実際の休止状態と dao を に配置しdevます)。

Spring プロファイルを使用したくない場合はapplicationContext.xml、3 つのファイルに分割することができます (共通 Bean 用、実際の DB Bean 用、モック用)。

もう 1 つのセクシーな方法 - springockito-annotationsを使用します (ただし、休止状態が読み込まれないようにする必要があります)。

于 2013-03-13T22:26:25.480 に答える