0

プライベート メソッドの動作をテストしたい。メソッド「moveDataToArchive」は 4 つのステップを実行します。

それは 4 倍です: 日付を計算し、サブメソッドを呼び出します。

これは私のテストです:

@Test
    public void testMoveData2Archive() throws Exception{

    final long now = 123456789000L;

    //Necessary to make the archivingBean runable.
    Vector<LogEntry> logCollector = new Vector<LogEntry>();
    Deencapsulation.setField(archivingBean, "logCollector", logCollector);

    new NonStrictExpectations(archivingBean) {
        {       //Lets fake the DB stuff.
            invoke(archivingBean, "getConnection");result = connection;
            connection.prepareStatement(anyString); result = prepStatement;
            prepStatement.executeUpdate(); returns(Integer.valueOf(3), Integer.valueOf(0), Integer.valueOf(3));
        }
    };

    new NonStrictExpectations(props) {
        {    //This is important. The numbers will be used for one of each 4 submethods
            props.getProperty(ArchivingHandlerBean.ARCHIVING_CREDMATURITY_OVER_IN_DAYS); result = "160";
            props.getProperty(ArchivingHandlerBean.ARCHIVING_CREDHIST_AGE_IN_DAYS); result = "150";
            props.getProperty(ArchivingHandlerBean.ARCHIVING_DEBTHIST_AGE_IN_DAYS); result = "140";
            props.getProperty(ArchivingHandlerBean.ARCHIVING_LOG_AGE_IN_DAYS); result = "130";
        }
    };

    new Expectations() {
        {
            Date expected = new Date(now - (160 * 24 * 60 * 60 * 1000));
            invoke(archivingBean, "moveCreditBasic2Archive", expected);

            expected = new Date(now - (150 * 24 * 60 * 60 * 1000));
            invoke(archivingBean, "moveCreditHistory2Archive", expected);

            expected = new Date(now - (999 * 24 * 60 * 60 * 1000));
            invoke(archivingBean, "moveDebtorHistory2Archive", expected);

            expected = new Date(now - (130 * 24 * 60 * 60 * 1000));
            invoke(archivingBean, "moveLog2Archive", expected);

        }
    };

    Calendar cal = Calendar.getInstance();
    cal.setTimeInMillis(now);
    Deencapsulation.invoke(archivingBean,"moveDataToArchive",cal, props);
}

どうしたの?3 番目の予定日を参照してください。違います!(140 ではなく 999)。また、呼び出しの順序を変更しました。私もそれらのプライベートメソッドを公開して試してみました。これらすべての変更は結果を変更しませんでした: テストは緑色です。

ここで何が問題なのですか?テストが緑色なのはなぜですか?

4

2 に答える 2

0

@Rogério: あなたの仮定は完全には機能しません。つまり、setProperty() がありません。私が試したのは、Verifications-Block を使用することです。

悲しいことに、私はJMockitを実行するのに十分なほどよく理解していません...

私は2つのことをしました。まず、4 つのプライベート メソッドをモックしてみました。私は彼らが呼ばれるかどうかだけを見たいです。しかし、ロジックを実行したくありません。最初の NonStrictExpectations-Block を次のように拡張して試しました。

 new NonStrictExpectations(archivingBean) {
        {
            invoke(archivingBean, "getConnection");result = connection;
            connection.prepareStatement(anyString); result = prepStatement;
            prepStatement.executeUpdate(); returns(Integer.valueOf(3), Integer.valueOf(0), Integer.valueOf(3));
            //New part
            invoke(archivingBean, "moveCreditBasic2Archive", withAny(new Date()));
            invoke(archivingBean, "moveCreditHistory2Archive", withAny(new Date()));
            invoke(archivingBean, "moveDebtorHistory2Archive", withAny(new Date()));
            invoke(archivingBean, "moveLog2Archive", withAny(new Date()));
        }
    };

一方、Expectations-Block を下に移動して、Verifications Block にしました。現在、JUnit は次のエラーで失敗します。

mockit.internal.MissingInvocation: Missing invocation of:
de.lpm.ejb.archiving.ArchivingHandlerBean#moveCreditBasic2Archive(java.util.Date pOlderThan)
with arguments: Tue Feb 03 03:39:51 CET 2009
on mock instance: de.lpm.ejb.archiving.ArchivingHandlerBean@1601bde
at de.lpm.ejb.archiving.ArchivingHandlerBean.moveCreditBasic2Archive(ArchivingHandlerBean.java:175)
[...]
Caused by: Missing invocation

これは ArchivingHandlerBean.java の 170 ~ 175 行です。

170: Connection connection = getConnection();
171: SQLService service = new SQLService(connection);
172:            
173: PreparedStatement prepStmtMove = null;
174:            
175: Vector<HashMap<String, String>> where_clauses = new Vector<HashMap<String,String>>();

4 つのプライベート メソッドが正しい日付で実行されていることを確認したいだけです。

于 2013-06-25T14:39:35.407 に答える
0

テストは、同じモックに対して厳密な期待と非厳密な期待を混在させることにより、モック API を悪用しています ( archivingBean)。このモックに記録された最初の期待値は厳密ではないため、JMockit はそれをテスト全体の非厳密なモックと見なします。

テストを記述する正しい方法は、テストの最後に厳密な期待ブロック (「サブメソッド」への 4 つの呼び出しを含むブロック) を検証ブロックに変えることです。

(余談ですが、テスト全体にはいくつかの問題があります。1) 一般に、プライベート メソッドは、パブリック メソッドを介して間接的にテストする必要があります。2) また、特に強い理由がない限り、private メソッドをモック化しないでください。この場合、出力ファイルの実際の内容を検証するテストを作成することになるでしょう。3) 不必要に嘲笑しないでください。代わりにprops-props.setPropertyを使用できます。4) オートボクシングを使用する - Integer.valueOf(3)-> 3)。

于 2013-06-25T12:35:12.040 に答える