cha*_*l03 5 mvp android unit-testing
已经两个月了,我一直在与MVP Structure合作来创建Android应用。
正如我在有关MVP的每个链接中所介绍的那样,Presenter类负责处理所有业务登录和数据(来自Model类),我明白了并开始工作。
教程中显示的优点之一,我想在此强调,MVP使单元测试更加容易,因为它不依赖于视图(我也很理解)。
我不明白的是为什么要创建一个界面来更新来自演讲者的视图,而我只能调用一个演讲者的方法,该方法将返回一个值,我可以在那里设置它?
让我们来谈谈我上面提到的优势(单元测试)。使用这些接口单元测试会带来更多问题,因为方法需要接口实现来完成我们在单元测试中没有的操作(我知道工具测试也出现在单元测试中,但我只是在谈论非UI测试)。
我只喜欢调用presenter方法并获取值并在片段或活动本身中的视图中进行设置,其中,随着接口的创建会带来另一层次的复杂性和不必要的接口声明,因此所有视图操作都将得以实现。有点令人沮丧。
与我一起工作的一位朋友指出了我的代码中的这个问题,并告诉我查看所有在线引用以澄清我的错误。但是我想知道这些接口如何在编程实践中全面帮助。因为我不能只消化它。它变成了我的屁股上的痛苦。我看了所有在线参考资料都没有解决方法。
演示者界面
class Presenter
{
private ViewInterface viewInterface;
public void setViewInterface(ViewInterface viewInterface)
{
this.viewInterface = viewInterface;
}
// Here value is being passed to interface method that is implemented in fragment.
// No problem with this implementation but why to do it.
// It will make unit test problematic as this method needs ViewInterface.
public void calculate()
{
// Some calculation
viewInterface.updateView(/*pass some paramerer*/);
}
}
Run Code Online (Sandbox Code Playgroud)
没有界面的演示者
class Presenter
{
// Here just take the value and set the view in fragment
// Unit test easier just check the returned value.
public int calculate()
{
int result = -1;
// Some calculation
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
正在使用主持人的片段
class MyFragment extends Fragment{
....
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.layout1, container, false);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState)
{
super.onViewCreated(view, savedInstanceState);
// just call method and get value to set in a view.
int result = new Presenter().calculate();
// set result in a view
}
}
Run Code Online (Sandbox Code Playgroud)
请检查上面代码中的注释。
任何帮助将不胜感激。提前致谢。
小智 4
自从我从自己的新手代码过渡到 MVP 以来,仅仅几个月的时间,我不得不说,学习这种架构让我成为了一名更好的程序员,并让我对接口有了新的认识。
我没有教育或经验来谈论SOLID或计算机科学中的任何其他原则,但我可以根据我所学到的和经历的内容向您提供我的意见。
为每个组件提供接口可以很容易地了解您的应用程序的功能。
查看以下合同,可在此处找到:
我确切地知道这个应用程序的整个模块中发生了什么。如果我关心事情是如何完成的,我可以查看实施情况。在编写单元测试时,我不关心事情如何工作,只关心它们确实有效。我可以更改每个组件(M、V 或 P),而不会破坏应用程序中的任何内容。
当我们对同一个模型有多个视图时,可能存在这样的用例。我们可以有一个 ProductListCustomView、一个 ProductListFragment 和一个 ProductListActivity。我们可以根据应用程序运行的设备选择其中之一。它们都实现相同的接口,因此即使在运行时也很容易进行更改。
public class ProductListContract {
public interface View {
void showProducts(List<Product> products);
void showAddProductForm();
void showEditProductForm(Product product);
void showDeleteProductPrompt(Product product);
void showGoogleSearch(Product product);
void showEmptyText();
void hideEmptyText();
void showMessage(String message);
}
public interface Actions {
void loadProducts();
void onAddProductButtonClicked();
void onAddToCartButtonClicked(Product product);
Product getProduct(long id);
void addProduct(Product product);
void onDeleteProductButtonClicked(Product product);
void deleteProduct(Product product);
void onEditProductButtonClicked(Product product);
void updateProduct(Product product);
}
public interface Repository {
List<Product> getAllProducts();
Product getProductById(long id);
void deleteProduct(Product product);
void addProduct(Product product);
void updateProduct(Product product);
}
Run Code Online (Sandbox Code Playgroud)
}
看看上面的例子,我不认为 Presenter 的接口是必要的,除非你有多个 Presenter 的实现。我无法想到视图可以与多个演示者类型关联的场景(例如 LongProductListPresenter、ShortProductListPresenter 等)
使用 MVP 完成应用程序几个月后,您可能决定更改某些视图,将它们转换为自定义视图,或将布局转换为 Android 发布的最新大东西。
您还可以决定使用不同的库来存储数据或网络。
您可能想要更改演示器中的逻辑,但您不太可能有一天早上醒来并决定您的应用程序需要一个全新的演示器。
google 的 MVP todo 示例使用演示者界面。因此,绝大多数的开发者,都会这样做。如果有一天他们更改了这个示例应用程序,那么其他人也会很快效仿。
归根结底,您是架构师,如何构建应用程序是您(或您的老板)的决定。
我希望无论您做出哪种选择,您在做出自己的决定时都会更有信心。
这是关于该主题的另一篇文章。
http://blog.karumi.com/interfaces-for-presenters-in-mvp-are-a-waste-of-time/
归档时间: |
|
查看次数: |
1801 次 |
最近记录: |