我正在尝试使用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不会被调用。我不知道自己在做什么错。
不好。:代码运行良好,问题在于仅运行测试