4

モックに問題がありますCalendar.getInstance()。このメソッドは、私がモックしているオブジェクトである Calendar を返します。

現在、私のコードは次のようになっています。

@RunWith(PowerMockRunner.class)
@PrepareForTest(Calendar.class)
public class SurveillanceDatabaseTest {
    @Test
    public void testFailingDatabase() throws Exception {
        mockStatic(Calendar.class);
        Calendar calendar = new GregorianCalendar();
        calendar.add(Calendar.HOUR, 1);
        when(Calendar.getInstance()).thenReturn(calendar);
        final Surveillance surveillance = new Surveillance();
        surveillance.checkDatabase();
   }
}

Calendar.getInstance()surveillance.checkDatabase()新しいオブジェクトであり、Calendar の期待されるモックではないたびに、何度も呼び出されます。

誰かが私が間違っていることを見ることができますか?

4

3 に答える 3

0

あなたはすべてを正しくやっているようです。たとえば、以下のこのテストはパスし、Calendar返された byCalendar#getInstance()が実際に静的モックで設定したものであることを証明します。

import static org.junit.Assert.*;
import static org.powermock.api.mockito.PowerMockito.*;

import java.util.Calendar;
import java.util.GregorianCalendar;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class)
@PrepareForTest(Calendar.class)
public class MockCalendarTest {
    @Test
    public void testFailingDatabase() {
        mockStatic(Calendar.class);

        final Calendar testCalendar = new GregorianCalendar();
        testCalendar.add(Calendar.HOUR, 1);
        when(Calendar.getInstance()).thenReturn(testCalendar);

        final Surveillance surveillance = new Surveillance();
        final Calendar resultCalendar = surveillance.checkDatabase();

        assertTrue(testCalendar == resultCalendar);
   }

    public static class Surveillance {
      public Calendar checkDatabase() {
        return Calendar.getInstance();
      }
    }
}

おそらく、クラスの関連部分を投稿してSurveillance、新しいものを取得しようとしている方法を確認し、Calendar失敗した理由を評価できるようにします.

于 2013-02-14T14:53:33.247 に答える