android - 如何使用 Mockito 在 Presenter 中测试 void 方法?
问题描述
我有一个使用 MVP 模式构建的非常简单的应用程序。这是我的合同:
public interface CitiesContract {
interface View {
void addCitiesToList(List<City> cityList);
}
interface Presenter {
void getCityList();
}
interface Model {
List<City> getCityList();
}
}
这是我的观点:
public class CitiesActivity extends AppCompatActivity implements CitiesContract.View {
private List<City> cityList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_cities);
CitiesPresenter presenter = new CitiesPresenter(this);
presenter.getCityList();
}
@Override
public void addCitiesToList(List<City> cities) {
cityList.addAll(cities);
}
}
这是我的主持人:
public class CitiesPresenter implements CitiesContract.Presenter {
private CitiesContract.View view;
private CitiesModel model;
public CitiesPresenter(CitiesContract.View view) {
this.view = view;
model = new CitiesModel();
}
@Override
public void getCityList() {
List<City> cityList = model.getCityList();
view.addCitiesToList(cityList);
}
}
这是我的模型:
public class CitiesModel implements CitiesContract.Model {
@Override
public List<City> getCityList() {
List<City> cityList = new ArrayList<>();
//Add 30 cities to the list
return cityList;
}
}
如何getCityList()
在我的 Presenter 中测试该方法?这是我到目前为止所尝试的:
public class CitiesPresenterTest {
private CitiesContract.Presenter citiesPresenter;
@Mock
private CitiesContract.View citiesView;
public void setUp() {
MockitoAnnotations.initMocks(this);
citiesPresenter = new CitiesPresenter(citiesView);
}
@Test
public void getCityListTest() {
citiesPresenter.getCityList();
//What to do next???
}
}
解决方案
好的,顺便说一句,这是个好问题。首先,您还需要模拟您的模型。第二:安排一些东西:例如model.getCityList()
返回null。之后,您可以使用 mockitosverify
运算符进行验证。例子:
when(model.getCityList()).thenReturn(null);
citiesPresenter.getCityList();
verify(view).addCitiesToList(null);
另一种情况可能就是这样,但列表为空:
List<City> citiesList = new ArrayList<>();
when(model.getCityList()).thenReturn(citiesList );
citiesPresenter.getCityList();
verify(view).addCitiesToList(citiesList);
另一个可以是这样的,你可以自己构建一个虚假的 List 来测试它:
List<City> citiesList = new ArrayList<>();
list.add(City("name", "something else", "i don't know what atributes you have"));
when(model.getCityList()).thenReturn(citiesList );
citiesPresenter.getCityList();
verify(view).addCitiesToList(citiesList);
希望我有所帮助。
附加信息:在进行单元测试时,你应该有 3 个基本步骤:首先你安排:所以你创建自己的场景。例如如果列表为空怎么办。第二:你行动:这一步是你测试你想要的方法的地方。第三:断言:这是您验证或断言您的期望与给定代码匹配的地方。
推荐阅读
- powershell - 奇怪地输出文件名
- ios - 当用户点击不同的 textField 时,关闭 pickerView 并打开相应的pickerView
- docker - 无法打开在端口上运行的 docker 应用
- r - 如何选择列中具有相同值的行并保持此特征
- javascript - 如何在 HTML 标头中包含 JavaScript 变量?
- security - 什么类型的身份验证安全实现了 Odoo 10
- c++ - c++ 复制对象到指针数组
- java - 在Java for循环中获取NullPointerException
- sql - 查看名称为“ENG_Parameters_%”的表中的列
- makefile - gnu make 可以处理什么格式的配置文件?