【问题标题】:Android MVP presenter unit test with Mockito causes "Wanted but not invoked" error使用 Mockito 的 Android MVP 演示者单元测试导致“想要但未调用”错误
【发布时间】:2021-09-28 05:34:31
【问题描述】:

我知道之前有人问过这个问题,但我目前正在潜入测试,我很难使用 Mockito 以 MVP 模式对演示者进行单元测试

我的代码设置:
物品类别

public class ItemJSON {

   @SerializedName("title")
    String textHolder;

    @SerializedName("id")
    int factNumber;

    public ItemJSON(String factText, int factNumber) {
        this.textHolder = factText;
        this.factNumber = factNumber;
    }

   //getters and setters
}

承包商:

public interface Contractor {

    interface Presenter {
        void getPosts();
    }

    interface View {
     //parse data to recyclerview on Succesfull call. 
        void parseDataToRecyclerView(List<ItemJSON> listCall);

        void onResponseFailure(Throwable throwable);
    }

    interface Interactor {

        interface onGetPostsListener {
            void onSuccessGetPostCall(List<ItemJSON> listCall);
            void onFailure(Throwable t);
        }


        void getPosts(onGetPostsListener onGetPostsListener);

    }
}

API 类:

 @GET("posts")
    Call<List<ItemJSON>> getPost();

交互类:

public class InteractorImpl implements Contractor.Interactor{

    @Override
    public void getPosts(onGetPostsListener onGetPostsListener) {
// NetworkService responsible for seting up Retrofit2
        NetworkService.getInstance().getJSONApi().getPost().enqueue(new Callback<List<ItemJSON>> () {
            @Override
            public void onResponse(@NonNull Call<List<ItemJSON>> call, @NonNull Response<List<ItemJSON>> response) {
                Log.d("OPERATION @GET","CALLBACK SUCCESSFUL");
                onGetPostsListener.onSuccessGetPostCall (response.body ());
            }

            @Override
            public void onFailure(@NonNull Call<List<ItemJSON>>call, @NonNull Throwable t) {
                Log.d("OPERATION @GET","CALLBACK FAILURE");
                onGetPostsListener.onFailure (t);
            }
        });
    }

演讲者类:

public class PresenterImpl implements Contractor.Presenter, Contractor.Interactor.onGetPostsListener {

    private final Contractor.View view;
    private final Contractor.Interactor interactor;

    public PresenterImpl (Contractor.View view,Contractor.Interactor interactor){
        this.view = view;
        this.interactor = interactor;
    }

    @Override
    public void getPosts() {
            interactor.getPosts (this);
    }


@Override
public void onSuccessGetPostCall(List<ItemJSON> listCall) {
    view.parseDataToRecyclerView (listCall);
}
}

所以我尝试在演示者上运行一些单元测试,但他们经常失败,我不断收到下一个错误

Wanted but not invoked Actually, there were zero interactions with this mock   

单元测试类:

@RunWith (MockitoJUnitRunner.class)
public class ApiMockTest{

    @Mock
    Contractor.View view;

    private PresenterImpl presenter;

    @Captor
    ArgumentCaptor<List<ItemJSON>> jsons;

    @Before
    public void setUp() {
        MockitoAnnotations.openMocks (this);
        presenter = new PresenterImpl (view,new InteractorImpl ());
    }

    @Test
    public void loadPost() {
        presenter.getPosts ();
        verify(view).parseDataToRecyclerView (jsons.capture ());
        Assert.assertEquals (2, jsons.capture ().size ());
    }
}

我试图了解我做错了什么以及如何解决这个问题,但现在我已经没有想法了。我会感谢任何帮助。 提前谢谢

UPD:在所有情况下,主活动演示者都会在 onClick 中调用 主要活动类:

public class MainActivity extends AppCompatActivity implements Contractor.View {
public Contractor.Presenter presenter;
  @Override
    protected void onCreate(Bundle savedInstanceState) {
presenter = new PresenterImpl (this,new InteractorImpl ());
        binding.getButton.setOnClickListener(view ->presenter.getPosts () );
...//code

  @Override
    public void parseDataToRecyclerView(List<ItemJSON> listCall) {
        adapter.updateList(listCall); //diff call to put data into recyclerview adapter
    }
}
}

【问题讨论】:

    标签: android unit-testing mockito android-mvp presenter


    【解决方案1】:

    即使使用 mockk 库,我也遇到过这种情况。问题是您的方法是接口方法。您需要从已实现此接口的视图中实际调用它。

    【讨论】:

    • 感谢您的回答。但我不明白 - 我的 MainActivity 中有一个演示者,它在用户单击按钮后被调用,然后使用 View 界面将其放入 recycler view 中。我提供了额外的代码,以阐明我的 Main Activity 的样子
    猜你喜欢
    • 1970-01-01
    • 2019-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多