0

次のコード行を使用するメソッドがあります。

/* 1 */ DateTimeFormat serverFormat = DateTimeFormat.getFormat("MM/dd/yyyy");
/* 2 */ DateTimeFormat displayFormat = DateTimeFormat.getFormat("MMM dd, yyyy");
/* 3 */ Date thisDate = serverFormat.parse(prices.getCheckInDate());

テストケース(Mockito)からこのメソッドを呼び出すと、NullPointerException行番号1で a が発生します。

Localeが原因で発生していると思います。ロケールについてはよくわかりません。スタックトレースも貼り付けています。

それをテストする正しい方法は何ですか?テスト ケースからロケール情報を提供することはできますか?

testSetupMyTable(MyViewTest)java.lang.NullPointerException
    at com.google.gwt.i18n.client.LocaleInfo.ensureDateTimeFormatInfo(LocaleInfo.java:201)
    at com.google.gwt.i18n.client.LocaleInfo.getDateTimeFormatInfo(LocaleInfo.java:159)
    at com.google.gwt.i18n.client.DateTimeFormat.getDefaultDateTimeFormatInfo(DateTimeFormat.java:808)
    at com.google.gwt.i18n.client.DateTimeFormat.getFormat(DateTimeFormat.java:625)


    at MyView.setupMyView(MyView.java:109)
    at MyViewTest.testSetupMyTable(MyViewTest.java:49)
4

4 に答える 4

1

DateTimeフォーマットロジックをUtilクラスにカプセル化しました。

class Util {
  formatDate() {}
}

そして今、私はユーティリティクラスのメソッドをモックしています。DateTimeFormat APIはすでにテストされているので、テストについて心配する必要はないと思います。

この特定のケースでは、私のテストでは日付変換が正確である必要がないため、このソリューションは正常に機能しますが、日付変換を正確にしたい場合はどうなりますか?

于 2012-10-22T03:07:28.347 に答える
1

GwtMockitoを使用することをお勧めします。日付をフォーマットするコンポジットをテストしたいとします。

public class MyComposite extends Composite {

    private static final DateTimeFormat FORMATTER = DateTimeFormat.getFormat("dd MMM yy");

    private Label labelName, labelDate;

    @Override
    public void updateHeaderData(String userName, Date dateToShow) {
        labelName.setText(messages.hiUser(userName));
        labelDate.setInnerText(FORMATTER.format(dateToShow));
    }
}

そして、私のパターンを使用して例外を回避するテスト:

@RunWith(GwtMockitoTestRunner.class)
public class CompositeToTest {

    MyComposite composite;
    @GwtMock
    LocaleInfoImpl infoImpl;

    @Before
    public void setUp() throws Exception {
        com.google.gwt.i18n.client.DateTimeFormatInfo mockDateTimeFormatInfo =
            mock(com.google.gwt.i18n.client.DateTimeFormatInfo.class);
        when(infoImpl.getDateTimeFormatInfo()).thenReturn(mockDateTimeFormatInfo);
        String[] months =
            new String[] {"ene", "feb", "mar", "abr", "may", "jun", "jul", "ago", "sep", "oct", "nov", "dic"};
        when(mockDateTimeFormatInfo.monthsShort()).thenReturn(months);
    }

    @Test
    public void should_whenUpdateHeaderData() throws Exception {
        // Given
        composite = new MyComposite();

        // When
        composite.updateHeaderData("pepito", new Date());

        // Then
        verify(labelDate).setText(anyString());
    }
}
于 2014-10-09T16:31:41.033 に答える
0

静的メソッドをモックする必要さえありません。DateTimeFormat をモックするだけでかまいません。

DateTimeFormat serverFormat = mock(DateTimeFormat.class);
Date date = new Date();
when(serverFormat().parse(any())).thenReturn(date);
于 2012-10-16T09:49:20.483 に答える