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)中调用此方法时,aNullPointerException出现在第1行。

我相信这是由于语言环境而发生的。我对语言环境了解不多。我也在粘贴堆栈跟踪。

测试它的正确方法是什么?我可以以某种方式从我的测试用例中提供语言环境信息吗?

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 回答
0

您可以使用 GwtMockitoTestRunner 来运行您的单元测试。这应该可以解决您的问题。

@RunWith( GwtMockitoTestRunner.class )
public class TestClass
{
  ...
}
于 2015-09-02T17:26:30.117 回答