我正在尝试 mvp tdd。
我有以下模型,查看和演示者
的合同合同类
interface GithubContract {
interface View {
void displayUsers(List<GurkhaComboDTO> userList);
}
interface Model {
void getUsersAndPromptPresenter(String userName, Presenter presenter);
}
interface Presenter {
void searchUsers(String userName);
void loadUsers(List<GithubUserDTO> userList);
}
}
我试图单位测试主持人逻辑类似:
测试类
@RunWith(MockitoJUnitRunner.class)
public class GithubPresenterWithMockitoTest {
@Mock
GithubContract.Model mockedModel;
@Test
public void shouldDisplayUsersToScreen() {
//given
final GithubContract.View view = new MockView(); // I have created the mock myself for the view this time.
final GithubContract.Presenter presenter = new GithubPresenter(view, mockedModel);
***********************************************************
// I do not know what to write here
****************************************************
presenter.searchUsers("");
Assert.assertEquals(true, ((MockView) (view)).enoughItems);
}
}
我的 oilotview / view 类看起来像这样:
这是 ->模拟类
class MockView implements GithubContract.View {
boolean enoughItems = false;
@Override
public void displayUsers(List<GurkhaComboDTO> userList) {
enoughItems = true;
}
}
我的主持人合同的实现就是这样..
这是 ->真实类
class GithubPresenter implements GithubContract.Presenter {
private GithubContract.View view;
private GithubContract.Model model;
GithubPresenter(GithubContract.View view, GithubContract.Model model) {
this.view = view;
this.model = model;
}
@Override
public void searchUsers(String userName) {
model.getUsersAndPromptPresenter(userName, this);
}
@Override
public void loadUsers(List<GithubUserDTO> data) {
if (data != null) {
if (!data.isEmpty()) {
view.displayUsers(users);
}
}
}
我有模型类似的类实现:
这是 ->真实类
public class GithubModel implements Model {
@Inject
GithubAPIService apiService;
private Call<GithubUserListDTO> userListCall;
private Context context;
GithubModel(Context context) {
this.context = context;
apiService = Util.getAPIService(); // I am using dagger, retrofit and okhttp3 with GSON to get Objects directly from network call
}
@Override
public void getUsersAndPromptPresenter(final String userName, final GithubContract.Presenter presenter) {
userListCall = apiService.searchGitHubUsers(userName);
if(Util.isInternetConnected(context)) {
userListCall.enqueue(new Callback<GithubUserListDTO>() {
@Override
public void onResponse(Call<GithubUserListDTO> call, Response<GithubUserListDTO> response) {
try {
presenter.loadUsers(response.body().getList());
} catch (Exception ignored) {
Util.log(ignored.getMessage());
}
}
@Override
public void onFailure(Call<GithubUserListDTO> call, Throwable t) {
}
});
}else {
Util.log("No Internet");
}
}
}
现在真正的问题部分:
我已经成功地用githubcontract.model自己的模型来测试了主持人,但是我想使用摩擦图来模拟模型,但是由于我的 getUsersand and promptpresenter()方法是抽象的,返回void void void void void void void void void void void void void void void void void void void void void void void void void void void void void void void void void void void void void becture void void void void void从方法内的内部类中获取参数并回电给主持人。
我该如何模拟我的模型?如果我需要进行一些修改以使其能够进行测试,请建议您。
您不应将演示者传递给模型,模型和演示者,因为它可以防止模型类可重复使用。而是提供成功和错误回调(或包含这两个回调的复合对象)。然后,您将能够用Mockito捕获该回调,并致电所需的回调。同样,今天使用rxjava非常普遍,它使模型类更容易。
这是一个普遍的良好做法:您应该避免使用和/或方法名称中的单词,因为它表明该方法正在做不超过一件事,而这是不好的