无法使用 jmockit 模拟 DefaultHttpClient

Cannot Mock DefaultHttpClient using jmockit

我正在尝试使用 jmockit

模拟 org.apache.http.impl.client.DefaultHttpClient

我对 mocking 方法特别感兴趣 DefaultHttpClient.execute() 我似乎无法弄清楚为什么它不起作用。我可以确认 jmockit 对于其他 class 和我模拟的方法工作正常。

下面是代码示例。 谁能告诉我为什么 org.apache.http.impl.client.DefaultHttpClient 的模拟不起作用?

import java.io.IOException;

import javax.servlet.http.HttpServletResponse;

import mockit.Injectable;
import mockit.Mock;
import mockit.MockUp;
import mockit.Mocked;

import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.protocol.HttpContext;
import org.junit.Before;
import org.junit.Test;

import com.protecode.authenticationmodule.login.Login;

@SuppressWarnings("deprecation")
public class QueryTester2 {
    @Mocked HttpUriRequest uriRequest;
    @Injectable HttpContext context;

    @Before
    public void init() {

        new MockLoginClass2();
        new MockDefaultHttpClient2();
    }

    @Test
    public void QueryTester2_Test1() {

        try {

            // Works! True, or whatever the mocked value below
            System.out.println(Login.isLdapUser("john"));

            HttpClient c = new DefaultHttpClient();

            // Failed! Still prints "org.apache.http.impl.client.DefaultHttpClient@44f54792"
            // instead of "mockedResponseToString"
            System.out.println(c.toString());

            //Failed! I don't see the println of "Mocked DefaultHttpClient.execute"

            c.execute(uriRequest, context);



        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

// Mocks
@SuppressWarnings("deprecation")
class MockDefaultHttpClient2 extends
        MockUp<org.apache.http.impl.client.DefaultHttpClient> {
    @Mock
    public String toString() {
        System.out.println("mockedResponseToString");
        return "mockedResponseToString";
    }

    @Mock
    public HttpResponse execute(HttpUriRequest httpPost, HttpContext context)
            throws IOException, ClientProtocolException {
        System.out.println("Mocked DefaultHttpClient.execute");
        HttpServletResponse response = (HttpServletResponse) new org.eclipse.jetty.client.HttpResponse(
                null, null);
        return (HttpResponse) response;
    }
}

class MockLoginClass2 extends MockUp<Login> {
    @Mock
    protected static boolean isLdapUser(final String username) {
        return true;
    }
}

看来我上面的代码有误。 Jmockit 不执行模拟方法,因为我提供的签名有误。

@Mock
public HttpResponse execute(HttpUriRequest httpPost, HttpContext context)  throws IOException, ClientProtocolException {

改成如下代码后,jmockit成功mock或者"replace"原来的方法

@Mock
public CloseableHttpResponse execute(HttpUriRequest httpReq, HttpContext context) throws IOException, ClientProtocolException {