java - Android:在使用接口(interface)测试类期间提供模拟实现

标签 java android unit-testing mockito factory

我有一个界面

public interface Example{

public int sum(int a, int b);

public int diff(int a, int b);

}

现在我有了这个接口(interface)的实现:

public RealMath implements Example{

public int sum(int a, int b){
    //contact server do stuff and return value.
    return val;
}

public int diff(int a, int b){
    //contact server do stuff and return value.
    return val;
}
}

并且有一个工厂提供相应的实现:

public class ExampleFactory(){
public static final Example getExampleIns(String val){
return new RealMath();
}
}

现在,我有一个类User.java,它使用这个Example接口(interface)来进行一些工作。 我想测试 User 其中有一个调用的方法:

Example ex = ExampleFactory.getExampleIns();
ex.sum(val1, val2); 

并根据这个值进行一些处理。

我想对我的代码进行单元测试,并希望有一个示例接口(interface)的模拟实现,这样就不需要服务器依赖性,我只需为接口(interface)中的方法返回一些模拟值。

我的想法是在调用 ExampleFactory.getExampleIns(); 时(当测试用例运行时)提供我的模拟实现。

我厌倦了 Mockito (Android),它不支持静态方法模拟。

所以我有两个问题: 1.上面的设计有什么问题,我有一个工厂和各种实现并根据需求返回合适的对象?

  • 如何通过提供 Example 接口(interface)的模拟实现来测试 User.java
  • 谢谢。

    最佳答案

    1. What is wrong with the above design where I have a factory and various implementations and return the suitable object based on requirements?

    您在工厂中交付的实现是硬编码的,因此,如果您想更改实现,则必须更改代码。您无法动态更改 impl。

    2.- How do I test User.java by providing my mocked implementation for Example interface?

    不使用工厂,而是使用依赖注入(inject)。您可以在构造函数中将 Example 的正确实现传递给您的 User(例如),并将其存储为实例变量,以便以后可以使用它:

    private Example exampleImpl;
    
    public User(Example exampleImpl) {
        this.exampleImpl = exampleImpl;
    }
    
    public void methodUsingExample(Integer val1, Integer val2) {
        exampleImpl.sum(val1, val2);
    }
    

    测试时,您可以使用 Example 模拟构建您的 User 实例:

    Example mockExample = mock(Example.class);
    User user = new User(mockExample);
    // now User is using your mock
    user.methodUsingExample(1, 2);
    

    关于java - Android:在使用接口(interface)测试类期间提供模拟实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32672240/

    相关文章:

    java - 获取玩家库存,然后广播元素显示名称

    android listView 另一个水平的listView

    java - 在启动Intent之前更改布局内容,例如文本和图像

    unit-testing - 如何覆盖出现在 TestNG 报告中的测试方法名称?

    python - 如何存储 python nosetests 的测试数据?

    java - Spring Boot 应用程序。 SecurityContextHolder 与 HttpSession

    java - Android ServerSocket 端口选择

    java - 使用 spring、hibernate 和 scala,有没有比 dbunit 更好的加载测试数据的方法?

    android - 在循环 Recyclerview android 中捕捉中心 onItemClick

    java - 调用 mock 时的 NPE