[英]Android: Providing a mocked implementation during testing of a class using an interface
我有一个界面
public interface Example{
public int sum(int a, int b);
public int diff(int a, int b);
}
现在,我有了此接口的实现:
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
接口进行某些工作。 我想测试User
,其中有是调用一个方法:
Example ex = ExampleFactory.getExampleIns();
ex.sum(val1, val2);
并基于此值进行一些处理。
我想对我的代码进行单元测试,并希望有一个Example接口的模拟实现,因此不需要服务器依赖性,我只是为接口中的方法返回一些模拟值。
我的想法是在ExampleFactory.getExampleIns();
时提供模拟的实现ExampleFactory.getExampleIns();
被调用(在测试用例运行时)。
我厌倦了Mockito(Android),它不支持静态方法模拟。
因此,我有两个问题:1.如果上面的设计有我的工厂和各种实现,并根据需求返回合适的对象,那么上述设计有什么问题?
Example
接口的模拟实现来测试User.java
? 谢谢。
- 我有工厂和各种实现并根据需求返回合适的对象的上述设计有什么问题?
您在工厂提供的实现是硬编码的 ,因此,如果要更改实现,则必须更改代码。 您没有办法动态更改印象。
2.-如何通过为Example接口提供模拟实现来测试User.java?
与其使用工厂,不如使用依赖注入。 您可以将Example
的正确实现传递给构造函数中的User
(例如),并将其存储为实例变量,以便以后可以使用它:
private Example exampleImpl;
public User(Example exampleImpl) {
this.exampleImpl = exampleImpl;
}
public void methodUsingExample(Integer val1, Integer val2) {
exampleImpl.sum(val1, val2);
}
在测试时,您可以User
Example
模拟程序构造User
实例:
Example mockExample = mock(Example.class);
User user = new User(mockExample);
// now User is using your mock
user.methodUsingExample(1, 2);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.