Java 使用来自Cloud Firestore的Mockito和异步调用编写测试时出错
我正试图使用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)上 实际上,与这个模拟没有任何交互 以下是我的课程名称: ProfileListActivityPresenterTestJava 使用来自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
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