Java 模拟包含对SQLiteOpenHelper引用的类时出错
我为演示者编写单元测试,它需要模拟本地数据源 以下是我的简单测试:Java 模拟包含对SQLiteOpenHelper引用的类时出错,java,android,unit-testing,mockito,Java,Android,Unit Testing,Mockito,我为演示者编写单元测试,它需要模拟本地数据源 以下是我的简单测试: public class AddressPresenterTest { @Mock private AddressView mView; @Mock private AddressDataSource mDataSource; @Mock private AddressLocalDataSource mLocalDataSource; @Captor Argu
public class AddressPresenterTest {
@Mock
private AddressView mView;
@Mock
private AddressDataSource mDataSource;
@Mock
private AddressLocalDataSource mLocalDataSource;
@Captor
ArgumentCaptor<DataSourceCallback<Province>> mProvinceCallbackCaptor;
private AddressPresenter mPresenter;
@Before
public void beforeTest() {
MockitoAnnotations.initMocks(this);
mPresenter = new AddressPresenter(mDataSource, mView);
mPresenter.setLocalDataSource(mLocalDataSource);
}
@Test
public void When_SelectProvince_DataIsNull_ShowErrorMessage() {
mPresenter.getLocalProvinceById(2129023);
// Cause data source has callback, we need to capture the callback
ArgumentCaptor<Integer> provinceIdCaptor = ArgumentCaptor.forClass(Integer.class);
verify(mLocalDataSource).fetchProvinceById(provinceIdCaptor.capture(), mProvinceCallbackCaptor.capture());
mProvinceCallbackCaptor.getValue().onFailedLoad();
verify(mView).loadContentError();
}
}
当我改变我的AddressLocalDataSource
类时,我发现了一些奇怪的事情
public class AddressLocalDataSource {
private StaticDatabaseHelper mDatabaseHelper;
// /**
// * @param mDatabaseHelper
// */
// public AddressLocalDataSource(StaticDatabaseHelper mDatabaseHelper) {
// this.mDatabaseHelper = mDatabaseHelper;
// }
public void setDatabaseHelper(StaticDatabaseHelper mDatabaseHelper) {
this.mDatabaseHelper = mDatabaseHelper;
}
...
}
在我发现的内容下方:
StaticDatabaseHelper
object参数,它可以工作李>
StaticDatabaseHelper
初始化,但它不起作用李>
问题是我的AddressLocalDataSource
需要StaticDatabaseHelper
类的实例
有什么想法吗?谢谢似乎您还需要模拟StaticDatabaseHelper。然后Mockito应该自动将模拟实例注入AddressLocalDataSource。因此,添加以下行可能会解决您的问题:
public class AddressPresenterTest {
@Mock
StaticDatabaseHelper mockedDatabaseHelper;
...
✔ 回答
在我寻找解决方案的几个小时后,我得到了最简单的解决方案。
我认为android库中有一些不完整的地方需要测试。所以我只是运行这个gradle命令来清理:
./gradlew clean test
现在它可以工作了,在本例中,我只是模拟了StaticDatabaseHelper
类。
这是我最后一堂测试课:
公共类地址PresenterTest{
@嘲弄
私有地址视图;
@嘲弄
私有地址数据源mDataSource;
@嘲弄
私有地址localdatasource mLocalDataSource;
@俘虏
论证人MPProvinceCallbackCaptor;
私人发信人;
@以前
public void beforeTest()引发异常{
initMocks(this);
mPresenter=新地址演示者(mDataSource,mView);
mPresenter.setLocalDataSource(mLocalDataSource);
}
@试验
当\u SelectProvince\u DataIsNull\u ShowErrorMessage()时公共无效{
mPresenter.getLocalProvinceById(2129023);
//由于数据源有回调,我们需要捕获回调
ArgumentCaptor provinceIdCaptor=ArgumentCaptor.forClass(Integer.class);
验证(mLocalDataSource).fetchProvinceById(provinceIdCaptor.capture(),mproviceCallbackCaptor.capture());
mProvinceCallbackCaptor.getValue().onFailedLoad();
验证(mView).loadContentError();
}
}
希望得到这些帮助,谢谢你在我的项目中使用javassist-3.11.0.GA.jar。在google上发表了一些关于javassist verison的文章之后,我尝试将javassist升级到javassist-3.18.2-GA.jar或javassist-3.21.0-GA.jar,问题就解决了 其他一些问题可以通过以下方式解决: java.lang.VerifyError:分支目标处的堆栈映射帧不一致 40例外 , java.lang.RuntimeException:java.io.IOException:无效常量 类型:18 , 基础异常:java.lang.IllegalArgumentException:无法 创建类型 问候,
./gradlew clean test
public class AddressPresenterTest {
@Mock
private AddressView mView;
@Mock
private AddressDataSource mDataSource;
@Mock
private AddressLocalDataSource mLocalDataSource;
@Captor
ArgumentCaptor<DataSourceCallback<Province>> mProvinceCallbackCaptor;
private AddressPresenter mPresenter;
@Before
public void beforeTest() throws Exception {
MockitoAnnotations.initMocks(this);
mPresenter = new AddressPresenter(mDataSource, mView);
mPresenter.setLocalDataSource(mLocalDataSource);
}
@Test
public void When_SelectProvince_DataIsNull_ShowErrorMessage() {
mPresenter.getLocalProvinceById(2129023);
// Cause data source has callback, we need to capture the callback
ArgumentCaptor<Integer> provinceIdCaptor = ArgumentCaptor.forClass(Integer.class);
verify(mLocalDataSource).fetchProvinceById(provinceIdCaptor.capture(), mProvinceCallbackCaptor.capture());
mProvinceCallbackCaptor.getValue().onFailedLoad();
verify(mView).loadContentError();
}
}