我正在使用Twilio库,特别是我想在测试时注入TwilioRestClient的模拟。
它没有实现任何接口。而且我无法添加一个。
我不能从中继承它,它确实在我不喜欢的构造函数中完成了工作。
我需要在模拟中使用一些方法来覆盖或替换TwilioRestClient的某些行为。
我该怎么做呢?
我尝试了内部匿名类无济于事。我试过子类化,但显然不起作用。那里有Java专家吗?
编辑twilio sdk版本;
public class TwilioRestClient {
/** The Constant VERSION. */
private static final String VERSION = "3.3.15";
构造函数:
/**
* Explcitly construct a TwilioRestClient with the given API credentials.
*
* @param accountSid
* the 34 character Account identifier (starting with 'AC'). This
* can be found on your Twilio dashboard page.
* @param authToken
* the 32 character AuthToken. This can be found on your Twilio
* dashboard page.
*
*/
public TwilioRestClient(String accountSid, String authToken) {
this(accountSid, authToken, null);
}
/**
* Explcitly construct a TwilioRestClient with the given API credentials and
* endpoint.
*
* @param accountSid
* the 34 character Account identifier (starting with 'AC'). This
* can be found on your Twilio dashboard page.
* @param authToken
* the 32 character AuthToken. This can be found on your Twilio
* dashboard page.
* @param endpoint
* the url of API endpoint you wish to use. (e.g. -
* 'https://api.twilio.com')
*/
public TwilioRestClient(String accountSid, String authToken, String endpoint) {
validateAccountSid(accountSid);
validateAuthToken(authToken);
this.accountSid = accountSid;
this.authToken = authToken;
if ((endpoint != null) && (!endpoint.equals(""))) {
this.endpoint = endpoint;
}
//Grab the proper connection manager, based on runtime environment
ClientConnectionManager mgr = null;
try {
Class.forName("com.google.appengine.api.urlfetch.HTTPRequest");
mgr = new AppEngineClientConnectionManager();
} catch (ClassNotFoundException e) {
//Not GAE
mgr = new ThreadSafeClientConnManager();
((ThreadSafeClientConnManager) mgr).setDefaultMaxPerRoute(10);
}
setHttpclient(new DefaultHttpClient(mgr));
httpclient.getParams().setParameter("http.protocol.version",
HttpVersion.HTTP_1_1);
httpclient.getParams().setParameter("http.socket.timeout",
new Integer(CONNECTION_TIMEOUT));
httpclient.getParams().setParameter("http.connection.timeout",
new Integer(CONNECTION_TIMEOUT));
httpclient.getParams().setParameter("http.protocol.content-charset",
"UTF-8");
this.authAccount = new Account(this);
this.authAccount.setSid(this.accountSid);
this.authAccount.setAuthToken(this.authToken);
}
最佳答案
您想避免使用模拟框架,并且不想扩展/覆盖TwilioRestClient。
因此,“纯Java”方法可能是让您的类使用TwilioRestClient而不是使用您定义的接口。难度取决于您实际使用了多少TwilioRestClient接口。
如果仅使用几种方法,请定义自己的接口,例如:
public interface RestClient {
String get(String uri);
}
当您想使用TwilioRestClient时,可以:
final TwilioRestClient trc = createTwilioRestClient();
myService.setRestClient(new RestClient() {
public String get(String uri) {
return trc.get(uri);
}
});
要进行单元测试时,请使用:
myService.setRestClient(new RestClient() {
public String get(String uri) {
return someMockData();
}
});
但是,如果您使用大量的界面,这将变得很麻烦。在这种情况下,模拟库确实是您最好的选择,这就是它们的用途。
关于java - Java:将对象设为“适合”的类型,其中基类不实现任何接口(interface)且不能从其继承,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17048782/