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;
    }
    ...
}
在我发现的内容下方:

  • 我试图删除我的构造函数和setter方法,该方法包含
    StaticDatabaseHelper
    object参数,它可以工作
  • 我试图更改setter方法中的
    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();
        }
    }