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中模拟静态方法。如果可能的话,你能告诉我怎么做吗?谢谢,如果你可以,请看我在另一个帖子中的回答:谢谢,塞里昂。你的回答可能对某人有帮助。