gpt4 book ai didi

Java:使对象 "fit"的类型为基类不实现接口(interface)且不能从中继承的类型

转载 作者:行者123 更新时间:2023-11-28 20:32:04 24 4
gpt4 key购买 nike

我正在使用 Twilio 库,特别是我试图在测试时注入(inject) TwilioRestClient 的模拟。

它不实现任何接口(interface)。而且我不能添加一个。

我不能继承它,它在我不喜欢的构造函数中做了一些事情。

我需要在 mock 中有几个方法来覆盖或替换 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 的类使用您定义的接口(interface)。这样做的难度取决于您实际使用了多少 TwilioRestClient 接口(interface)。

如果您只使用几种方法,请定义您自己的接口(interface),例如:

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:使对象 "fit"的类型为基类不实现接口(interface)且不能从中继承的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17048782/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com