Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Mockito测试用例中提供LocaleInfo?_Java_Gwt_Mockito - Fatal编程技术网

Java 如何在Mockito测试用例中提供LocaleInfo?

Java 如何在Mockito测试用例中提供LocaleInfo?,java,gwt,mockito,Java,Gwt,Mockito,我有一个使用以下代码行的方法: /* 1 */ DateTimeFormat serverFormat = DateTimeFormat.getFormat("MM/dd/yyyy"); /* 2 */ DateTimeFormat displayFormat = DateTimeFormat.getFormat("MMM dd, yyyy"); /* 3 */ Date thisDate = serverFormat.parse(prices.getCh

我有一个使用以下代码行的方法:

/* 1 */ DateTimeFormat serverFormat = DateTimeFormat.getFormat("MM/dd/yyyy");
/* 2 */ DateTimeFormat displayFormat = DateTimeFormat.getFormat("MMM dd, yyyy");
/* 3 */ Date thisDate = serverFormat.parse(prices.getCheckInDate());
当我从测试用例(Mockito)调用此方法时,在第#1行出现
NullPointerException

我相信这是由于地点的原因。我对地区了解不多。我也在粘贴堆栈跟踪

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

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)

您甚至不需要模拟静态方法,只需模拟DateTimeFormat即可

DateTimeFormat serverFormat = mock(DateTimeFormat.class);
Date date = new Date();
when(serverFormat().parse(any())).thenReturn(date);

我将DateTime格式化逻辑封装在一个Util类中:

class Util {
  formatDate() {}
}
现在我在模仿实用类的方法。 我想我不必担心DateTimeFormatAPI的测试,因为它已经过测试了

在这种特殊情况下,我的测试不需要精确的日期转换,因此此解决方案可以正常工作,但如果我希望日期转换精确,该怎么办?

您最好使用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());
    }
}

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

@RunWith( GwtMockitoTestRunner.class )
public class TestClass
{
  ...
}

您的测试是否准确取决于日期转换?我假设您对测试DateTimeFormat的正确性不感兴趣,所以您可以模拟serverFormat和displayFormat来返回固定的日期。您尝试过GWT2.5吗?它可能会解决这个问题,因为它现在支持在普通VM中使用
GWT.create()
(即不是
gwtestcase
,不是DevMode,不是编译为JS)您可以发布测试用例的代码,这样我们就可以看到它出错的原因了吗?@Lauri my test不需要精确的日期转换。但我认为我们不能在Mockito中模拟静态方法。如果可能的话,你能告诉我怎么做吗?谢谢,如果你可以,请看我在另一个帖子中的回答:谢谢,塞里昂。你的回答可能对某人有帮助。