Java 使用来自Cloud Firestore的Mockito和异步调用编写测试时出错

Java 使用来自Cloud Firestore的Mockito和异步调用编写测试时出错,java,android,testing,mockito,android-testing,Java,Android,Testing,Mockito,Android Testing,我正试图使用Mockito为我的Android应用程序编写一些测试,但我一直遇到以下错误: 需要但未调用: view.displayProfiles( [com.example.reconheca.model。Profile@1e800aaa,com.example.reconheca.model。Profile@185a6e9,com.example.reconheca.model。Profile@6f03482] ); ->在com.example.reconheca.view.Profil

我正试图使用Mockito为我的Android应用程序编写一些测试,但我一直遇到以下错误:

需要但未调用: view.displayProfiles( [com.example.reconheca.model。Profile@1e800aaa,com.example.reconheca.model。Profile@185a6e9,com.example.reconheca.model。Profile@6f03482] ); ->在com.example.reconheca.view.ProfileListActivityPresenterTest.shouldPassProfileToView(ProfileListActivityPresenterTest.java:48)上 实际上,与这个模拟没有任何交互

以下是我的课程名称:

ProfileListActivityPresenterTest

private String usedId = "string";
private ArrayList<Profile> PROFILE_LIST = new ArrayList<>(Arrays.asList(new Profile(), new Profile(), new Profile()));
private Task<ArrayList<Profile>> task;
private ProfileListActivityPresenter presenter;

@Rule
public MockitoRule mockitoRule = MockitoJUnit.rule();

@Mock
ProfileFirestoreRepository profileRepository;

@Mock
ProfileListActivityView view;

@Before
public void setUp() {
    task = getTestTaskWithResult();
    presenter = new ProfileListActivityPresenter(view, profileRepository);
}

@Test
public void shouldPassProfileToView() {
    when(profileRepository.getProfilesFromUser(usedId)).thenReturn(task);
    presenter.loadProfiles(usedId);
    verify(view).displayProfiles(task.getResult());
}

@Test
public void shouldHandleNoProfile() {
    when(profileRepository.getProfilesFromUser(usedId)).thenReturn(task);
    presenter.loadProfiles(usedId);
    verify(view, never()).displayNoProfiles();
}

public Task<ArrayList<Profile>> getTestTaskWithResult() {
    TaskCompletionSource<ArrayList<Profile>> taskCompletionSource = new TaskCompletionSource<>();
    taskCompletionSource.setResult(PROFILE_LIST);
    return taskCompletionSource.getTask();
}
private String usedId=“String”;
private ArrayList PROFILE_LIST=new ArrayList(Arrays.asList(new PROFILE(),new PROFILE(),new PROFILE());
私人任务;
private ProfileListActivityPresenter演示者;
@统治
public MockitoRule MockitoRule=MockitoJUnit.rule();
@嘲弄
ProfileFirestoreRepository profileRepository;
@嘲弄
ProfileListActivityView视图;
@以前
公共作废设置(){
task=getTestTaskWithResult();
presenter=new ProfileListActivityPresenter(视图,profileRepository);
}
@试验
public void shouldPassProfileToView(){
当(profileRepository.getProfilesFromUser(usedId))。然后返回(任务);
演示者。加载配置文件(usedId);
验证(查看).displayProfiles(task.getResult());
}
@试验
公共无效应与LENOPROFILE(){
当(profileRepository.getProfilesFromUser(usedId))。然后返回(任务);
演示者。加载配置文件(usedId);
验证(查看,从不()).displayNoProfiles();
}
公共任务getTestTaskWithResult(){
TaskCompletionSource TaskCompletionSource=新的TaskCompletionSource();
taskCompletionSource.setResult(配置文件列表);
返回taskCompletionSource.getTask();
}
ProfileListActivityPresenter

private ProfileListActivityView view;
private ProfileFirestoreRepository profileFirestoreRepository;

public ProfileListActivityPresenter(ProfileListActivityView view, ProfileFirestoreRepository profileFirestoreRepository) {
    this.view = view;
    this.profileFirestoreRepository = profileFirestoreRepository;
}

public void loadProfiles(String userId) {
    Task<ArrayList<Profile>> task = profileFirestoreRepository.getProfilesFromUser(userId);

    task.addOnCompleteListener(new OnCompleteListener<ArrayList<Profile>>() {
        @Override
        public void onComplete(@NonNull Task<ArrayList<Profile>> task) {
            task.addOnSuccessListener(profiles -> {
                if (profiles.isEmpty()){
                    view.displayNoProfiles();
                } else {
                    view.displayProfiles(profiles);
                }
            })
            .addOnFailureListener(exception -> view.displayError(exception.getMessage()));
        }
    });
}
private ProfileListActivityView视图;
私有档案FireStoreRepository档案FireStoreRepository;
公共ProfileListActivityPresenter(ProfileListActivityView视图,ProfileFirestoreRepository ProfileFirestoreRepository){
this.view=视图;
this.profileFirestoreRepository=profileFirestoreRepository;
}
公共void加载配置文件(字符串userId){
Task Task=profileFirestoreRepository.getProfilesFromUser(用户ID);
task.addOnCompleteListener(新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
task.addOnSuccessListener(配置文件->{
if(profiles.isEmpty()){
view.displaynprofiles();
}否则{
视图。显示配置文件(配置文件);
}
})
.addOnFailureListener(异常->查看.displayError(异常.getMessage()));
}
});
}
ProfileListActivity

public class ProfileListActivity extends AppCompatActivity implements ProfileListActivityView {

// Omitted code

@Override
public void displayProfiles(List<Profile> profileList) {
    Profile[] profiles = profileList.toArray(new Profile[0]);
    profileAdapter = new ProfileAdapter(ProfileListActivity.this, profiles);
    gridView.setAdapter(profileAdapter);
    progressBar.setVisibility(View.GONE);
}

@Override
public void displayNoProfiles() {
    noProfileTextView.setVisibility(View.VISIBLE);
    progressBar.setVisibility(View.GONE);
}
公共类ProfileListActivity扩展AppCompatActivity实现ProfileListActivityView{
//省略代码
@凌驾
公共void显示配置文件(列表配置文件列表){
Profile[]profiles=profileList.toArray(新的Profile[0]);
profileAdapter=新的profileAdapter(ProfileListActivity.this,profiles);
setAdapter(profileAdapter);
progressBar.setVisibility(View.GONE);
}
@凌驾
公共void displayNoProfiles(){
noProfileTextView.setVisibility(View.VISIBLE);
progressBar.setVisibility(View.GONE);
}
}

数据库档案FireStoreRepository

public class DatabaseProfileFirestoreRepository implements ProfileFirestoreRepository {

private static final String TAG = "ProfileFirestoreRepo";

private final CollectionReference collectionReference;
private final String collectionName;

public DatabaseProfileFirestoreRepository(String collectionName) {
    this.collectionName = collectionName;

    FirebaseFirestore db = FirebaseFirestore.getInstance();
    this.collectionReference = db.collection(this.collectionName);
}

@Override
public Task<ArrayList<Profile>> getProfilesFromUser(String userId) {
    Log.i(TAG, "Getting profiles...");
    return collectionReference
            .whereEqualTo(Constant.PROFILE_USER_ID, userId)
            .get()
            .continueWith(new Continuation<QuerySnapshot, ArrayList<Profile>>() {
                @Override
                public ArrayList<Profile> then(@NonNull Task<QuerySnapshot> task) throws Exception {
                    ArrayList<Profile> profileList = new ArrayList<>();
                    QuerySnapshot querySnapshot = task.getResult();
                    assert querySnapshot != null;
                    if (querySnapshot.isEmpty()){
                        return profileList;
                    } else {
                        for (QueryDocumentSnapshot document : task.getResult()) {
                            Map<String, Object> data = document.getData();

                            Profile profile = new Profile(document.getId(), (String) data.get(Constant.PROFILE_USER_ID), (String) data.get(Constant.PROFILE_NAME), (String) data.get(Constant.PROFILE_PICTURE_PATH));
                            profileList.add(profile);
                        }
                        return profileList;
                    }
                }
            });
}
公共类数据库ProfileFirestoreRepository实现ProfileFirestoreRepository{
私有静态最终字符串TAG=“ProfileFirestoreRepo”;
私人最终收藏参考收藏参考;
私有最终字符串collectionName;
公共数据库档案FireStoreRepository(字符串集合名称){
this.collectionName=collectionName;
FirebaseFirestore db=FirebaseFirestore.getInstance();
this.collectionReference=db.collection(this.collectionName);
}
@凌驾
公共任务getProfilesFromUser(字符串用户ID){
Log.i(标记“获取配置文件…”);
返回集合引用
.whereEqualTo(Constant.PROFILE\u USER\u ID,userId)
.get()
.continueWith(新的continueWith(){
@凌驾
公共ArrayList然后(@NonNull Task Task)引发异常{
ArrayList profileList=新建ArrayList();
QuerySnapshot QuerySnapshot=task.getResult();
断言querySnapshot!=null;
if(querySnapshot.isEmpty()){
返回配置文件列表;
}否则{
对于(QueryDocumentSnapshot文档:task.getResult()){
Map data=document.getData();
Profile Profile=new Profile(document.getId(),(String)data.get(Constant.Profile\u USER\u ID),(String)data.get(Constant.Profile\u NAME),(String)data.get(Constant.Profile\u PICTURE\u PATH));
profileList.add(profile);
}
返回配置文件列表;
}
}
});
}
}

getProfilesFromUser方法使用位于DatabaseProfileFirestoreRepository的Cloud Firestore返回任务

任务完成后,onSuccess会将配置文件发送到“我的活动”,活动会在屏幕上显示配置文件

使用调试模式,我发现代码从不执行task.addOnCompleteListener和forward,因此displayProfiles永远不会被调用。我不知道我做错了什么


Obs.:代码工作正常,问题是只运行测试

Hi,我不确定为什么要在'task.addOnSuccessListener(profiles->{`您还没有提到您是否调用了
profiles
。嗨@the_低估了,我用更多信息编辑了这个问题。基本上,我将
profiles
发送到一个活动,该活动会在屏幕上显示这些配置文件。因此,任务完成并成功后,调用
view.displa