Java GWT MVP的测试用例,包含活动、地点和使用Mockito的GIN
我不熟悉GWT MVP模式,活动和场所与GIN相结合。我已经开始尝试使用Mockito为我的GWT项目编写JUnit测试用例。很多博客建议我不要使用GWT测试用例,因为它的性能很好,所以我计划坚持使用Mockito。我正在为其中一位演示者编写一个测试用例。由于我使用GIN为演示者中的大多数内容创建实例,所以我必须模拟GIN注入器对象。我的Junit测试用例不允许我模拟Gin注入器。我在某个地方读到,我们不能在Junit测试用例中使用Gin,而必须使用Guice。我的问题是,如何使用Mockito模拟我的杜松子酒注入器?我发现一些测试用例使用了与我在项目中使用的模式完全相同的模式,只是它们使用了客户机工厂。在测试用例中,我未能用GIN替换客户机工厂。我在网上找到的代码如下,在我的测试用例中,我必须用GIN注入器替换客户机工厂 @RunWith(MockitoJUnitRunner.class) 公共类ContactListActivityTest{Java GWT MVP的测试用例,包含活动、地点和使用Mockito的GIN,java,gwt,junit,mvp,mockito,Java,Gwt,Junit,Mvp,Mockito,我不熟悉GWT MVP模式,活动和场所与GIN相结合。我已经开始尝试使用Mockito为我的GWT项目编写JUnit测试用例。很多博客建议我不要使用GWT测试用例,因为它的性能很好,所以我计划坚持使用Mockito。我正在为其中一位演示者编写一个测试用例。由于我使用GIN为演示者中的大多数内容创建实例,所以我必须模拟GIN注入器对象。我的Junit测试用例不允许我模拟Gin注入器。我在某个地方读到,我们不能在Junit测试用例中使用Gin,而必须使用Guice。我的问题是,如何使用Mockito
@Mock
private IClientFactory clientFactoryMock;
@Mock
private PlaceController placeControllerMock;
@Mock
private IContactListView contactListViewMock;
@Mock
private AcceptsOneWidget acceptsOneWidgetMock;
@Mock
private IContactServiceAsync contactServiceAsyncMock;
@Mock
private EventBus eventBusMock;
private List<Contact> contacts;
private Contact contact1;
private Contact contact2;
@SuppressWarnings("unchecked")
@Before
public void setUp() throws Exception {
when(clientFactoryMock.getPlaceController()).thenReturn(placeControllerMock);
when(clientFactoryMock.getContactListView()).thenReturn(contactListViewMock);
when(clientFactoryMock.getContactService()).thenReturn(contactServiceAsyncMock);
Answer<Void> answer = new Answer<Void>() {
@Override
public Void answer(InvocationOnMock invocation) {
Object[] args = invocation.getArguments();
AsyncCallback<List<Contact>> asyncCallback = (AsyncCallback<List<Contact>>) args[0];
contact1 = new Contact();
contact1.setFirstName("Kai");
contact1.setLastName("Toedter");
contact1.setEmail("kai@toedter.com");
contact2 = new Contact();
contact2.setFirstName("Kai2");
contact2.setLastName("Toedter2");
contact2.setEmail("kai2@toedter.com");
final List<Contact> contacts2 = new ArrayList<Contact>();
contacts2.add(contact1);
contacts2.add(contact2);
asyncCallback.onSuccess(contacts2);
return null;
}
};
doAnswer(answer).when(contactServiceAsyncMock).getAllContacts(any(AsyncCallback.class));
// set the real contacts object, when clientFactory.setContacts is
// called
Answer<Void> setContactsAnswer = new Answer<Void>() {
@Override
public Void answer(InvocationOnMock invocation) throws Throwable {
contacts = (List<Contact>) invocation.getArguments()[0];
// System.out.println("answer() to setContacts(): " + contacts);
return null;
}
};
doAnswer(setContactsAnswer).when(clientFactoryMock).setContacts(any(List.class));
// Return the real contacts object, when clientFactory.getContacts is
// called
Answer<List<Contact>> getContactsAnswer = new Answer<List<Contact>>() {
@Override
public List<Contact> answer(InvocationOnMock invocation) throws Throwable {
return contacts;
}
};
doAnswer(getContactsAnswer).when(clientFactoryMock).getContacts();
}
@Test
public void testGotoPlace() {
ContactListActivity contactListActivity = new ContactListActivity(new ContactPlace(null), clientFactoryMock);
ContactPlace contactPlace = new ContactPlace("kai@toedter.com");
contactListActivity.goTo(contactPlace);
verify(placeControllerMock).goTo(contactPlace);
}
@Test
public void testStartWithEmptyToken() {
clientFactoryMock.setContacts(null); // force RCP
ContactListActivity contactListActivity = new ContactListActivity(new ContactPlace(""), clientFactoryMock);
contactListActivity.start(acceptsOneWidgetMock, eventBusMock);
verify(contactListViewMock).setPresenter(contactListActivity);
verify(contactListViewMock).initialize(contacts);
}
@Test
public void testStartWithToken() {
String token = "kai@toedter.com";
clientFactoryMock.setContacts(null); // force RCP
ContactListActivity contactListActivity = new ContactListActivity(new ContactPlace(token), clientFactoryMock);
contactListActivity.start(acceptsOneWidgetMock, eventBusMock);
verify(contactListViewMock).setPresenter(contactListActivity);
verify(contactListViewMock).initialize(contacts);
verify(contactListViewMock).selectInitialContact(contact1);
verify(eventBusMock).fireEvent(any(ContactViewEvent.class));
}
@Test
public void testMayStop() {
ContactListActivity contactListActivity = new ContactListActivity(new ContactPlace(null), clientFactoryMock);
contactListActivity.start(acceptsOneWidgetMock, eventBusMock);
contactListActivity.mayStop();
verify(contactListViewMock).setPresenter(null);
}
@Test
public void clientFactoryTest() {
List<Contact> testList = new ArrayList<Contact>();
clientFactoryMock.setContacts(testList);
Assert.assertNotNull(clientFactoryMock.getContacts());
}
@Mock
私有IClientFactoryClientFactoryMock;
@嘲弄
私募股权控制人私募股权;
@嘲弄
私有IContactListView contactListViewMock;
@嘲弄
私有AcceptsOneWidget AcceptsOneWidgetLock;
@嘲弄
专用IContactServiceAsync contactServiceAsyncMock;
@嘲弄
私有事件总线事件总线模拟;
私人名单联系人;
私人联络1;
私人联络2;
@抑制警告(“未选中”)
@以前
public void setUp()引发异常{
当(clientFactoryMock.getPlaceController())。然后返回(placeControllerMock);
当(clientFactoryMock.getContactListView())。然后返回(contactListViewMock);
当(clientFactoryMock.getContactService())。然后返回(contactServiceAsyncMock);
答案=新答案(){
@凌驾
公共无效应答(调用锁调用){
对象[]args=invocation.getArguments();
AsyncCallback AsyncCallback=(AsyncCallback)参数[0];
contact1=新触点();
联系人1.setFirstName(“Kai”);
联系人1.setLastName(“Toedter”);
联系人1.设置电子邮件(“kai@toedter.com");
contact2=新触点();
联系人2.setFirstName(“Kai2”);
联系人2.setLastName(“Toedter2”);
contact2.setEmail(“kai2@toedter.com");
最终列表联系人2=新的ArrayList();
contacts2.add(contact1);
contacts2.add(contact2);
asyncCallback.onSuccess(contacts2);
返回null;
}
};
doAnswer(answer).when(contactServiceAsyncMock).getAllContacts(any(AsyncCallback.class));
//当clientFactory.setContacts为
//叫
应答设置ContactsAnswer=新应答(){
@凌驾
公共Void应答(invocationmock调用)抛出可丢弃的{
联系人=(列表)调用.getArguments()[0];
//System.out.println(“对setContacts()的应答():”+contacts);
返回null;
}
};
doAnswer(setContactsAnswer).when(clientFactoryMock).setContacts(any(List.class));
//当clientFactory.getContacts为
//叫
答案getContactsAnswer=新答案(){
@凌驾
公共列表应答(invocationMock调用)抛出可丢弃的{
返回联系人;
}
};
doAnswer(getContactsAnswer).when(clientFactoryMock).getContacts();
}
@试验
公共void testGotoPlace(){
ContactListActivity ContactListActivity=new ContactListActivity(new ContactPlace(null),clientFactoryMock);
ContactPlace ContactPlace=新的ContactPlace(“kai@toedter.com");
contactListActivity.goTo(联系地点);
验证(placeControllerMock)。转到(contactPlace);
}
@试验
public void testStartWithEmptyToken(){
clientFactoryMock.setContacts(null);//强制RCP
ContactListActivity ContactListActivity=new ContactListActivity(new ContactPlace(“”),clientFactoryMock);
contactListActivity.start(接受ewidgetMock、eventBusMock);
验证(contactListViewMock).setPresenter(contactListActivity);
验证(contactListViewMock)。初始化(contacts);
}
@试验
公共无效testStartWithToken(){
字符串标记=”kai@toedter.com";
clientFactoryMock.setContacts(null);//强制RCP
ContactListActivity ContactListActivity=新的ContactListActivity(新的ContactPlace(令牌),clientFactoryMock);
contactListActivity.start(接受ewidgetMock、eventBusMock);
验证(contactListViewMock).setPresenter(contactListActivity);
验证(contactListViewMock)。初始化(contacts);
验证(contactListViewMock)。选择InitialContact(contact1);
验证(eventBusMock).fireEvent(任何(ContactViewEvent.class));
}
@试验
公共void testMayStop(){
ContactListActivity ContactListActivity=new ContactListActivity(new ContactPlace(null),clientFactoryMock);
contactListActivity.start(接受ewidgetMock、eventBusMock);
contactListActivity.mayStop();
验证(contactListViewMock).setPresenter(空);
}
@试验
public void clientFactoryTest(){
List testList=new ArrayList();
clientFactoryMock.setContacts(测试列表);
Assert.assertNotNull(clientFactoryMock.getContacts());
}
}
请提供帮助。如果您的代码依赖于
GInject
,则您有一个问题:您没有注射。如果需要对象工厂,请插入提供程序
但在您的情况下,IClientFactory
还充当列表的共享状态、值持有者或本地缓存;这意味着IClientFactory
违反了
因此,首先将本地缓存职责提取到它自己的对象(例如ContactListCache
对象,或更通用的ValueHolder
)中,然后注入该对象的实例。
当然,
@RunWith(GwtMockitoTestRunner.class)
public class AppControllerTest {
AppController controller;
@Mock
EventBus eventBus;
@Mock
AppInjector injector;
@Before
public void setUp() throws Exception {
}
@Test
public void shouldUseInjector() throws Exception {
// Given
controller = new AppController(eventBus, injector);
// When
controller.go();
// Verify
verify(injector).mainPresenter();
}
}