我正在尝试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);
}
}我的MockView /视图类如下所示:
,这是->模拟类
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的模拟测试了演示者,但是我想使用Mockito来模拟这个模型,但是由于我的GithubContract.Model方法是抽象的,所以返回了void,接受参数并从方法中的一个内部类调用演示者。
我怎么能嘲笑我的模特?如果我需要对架构进行一些修改,以使其能够测试,那么请提出建议。
发布于 2017-03-14 16:28:11
不应该将演示程序传递给Model,Model和presenter不应该紧密耦合,因为它阻止了模型类的可重用性。相反,提供完整的和错误的回调(或者包含这两个回调的复合对象)。然后您就可以用mockito捕获回调,并调用所需的回调。而且,现在使用RxJava非常普遍,它使模拟模型类变得更容易。
下面是一个一般的好做法:您应该避免在方法名称中使用和/或单词,因为它表明该方法正在做不止一件错误的事情。
https://stackoverflow.com/questions/42761910
复制相似问题