我正在尝试使用 TDD MVP 模式。
我有模型,视图和演示者
的以下合同合同类
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);
}
}
我的 MockView / VIEW 类看起来像这样:
这是 - &gt;模拟课
class MockView implements GithubContract.View {
boolean enoughItems = false;
@Override
public void displayUsers(List<GurkhaComboDTO> userList) {
enoughItems = true;
}
}
我的 PRESENTER 合同执行情况就是这样..
这是 - &gt;真实班级
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);
}
}
}
我有 MODEL 类实现,如下所示:
这是 - &gt;真实班级
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模拟测试演示者,但是我想使用Mockito来模拟模型但是因为我的 getUsersAndPromptPresenter()方法是抽象的,所以返回void,从方法内的Inner类获取参数并调用presenter。
我如何模拟我的模型?如果我需要对架构进行一些更改以便能够使其可测试,那么请提出建议。
答案 0 :(得分:2)
您不应该将演示者传递给Model,Model和Presenter不应该紧密耦合,因为它会阻止模型类重用。而是提供成功和错误回调(或包含这两个回调的复合对象)。然后,您将能够使用mockito捕获该回调并调用所需的回调。今天使用RxJava也很常见,它可以更容易地模拟Model类 这是一个通用的好习惯:你应该避免在方法名称中使用And / Or单词,因为它表明该方法不仅仅是一个不好的东西