首页 > 解决方案 > 如何使用 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???
    }
}

标签: androidmockitomvpandroid-testing

解决方案


好的,顺便说一句,这是个好问题。首先,您还需要模拟您的模型。第二:安排一些东西:例如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 个基本步骤:首先你安排:所以你创建自己的场景。例如如果列表为空怎么办。第二:你行动:这一步是你测试你想要的方法的地方。第三:断言:这是您验证或断言您的期望与给定代码匹配的地方。


推荐阅读