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

我正在尝试使用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();
}

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()));
        }
    });
}

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);
}

}

DatabaseProfileFirestore存储库

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;
                    }
                }
            });
}

}

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

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

使用调试模式,我看到代码从不执行task.addOnCompleteListener并转发,因此displayProfiles不会被调用。我不知道自己在做什么错。

不好。:代码运行良好,问题在于仅运行测试

hyk123456789 回答:使用Mockito和来自Cloud Firestore的异步调用编写测试时出错

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3039958.html

大家都在问