我正在使用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/

10-09 15:44