gpt4 book ai didi

java - 使用 Robolectrics 和 Mockito 来模拟/ stub 函数调用发出 http 请求,但它不起作用

转载 作者:行者123 更新时间:2023-11-29 20:18:02 30 4
gpt4 key购买 nike

我正在使用 RobolectricsMockito为了对android项目进行单元测试,我模拟了一个向后端发出http请求的方法。

http客户端的实际类:

public class MyHttpClient {
...
public int sendDataToBackend(Object data) {
return doHttpRequest(data);
}

private int doHttpRequest() {
System.out.println("start http request ...");
...
return responseCode;
}
}

上面的MyHttpClient类在MyService类中使用:

public class MyService {
...
public void notifyBackend(Object data) {
MyHttpClient client = new MyHttpClient();
int responseCode = client.sendDataToBackend(data);
...
}
}

我对 MyService 进行单元测试:

@RunWith(RobolectricTestRunner.class)
public class MyServiceTest {
@Mock
private MyHttpClient client;

@InjectMocks
private MyService service;

@Before
public void setUp() {
client = new MyHttpClient();
service = new MyService();
}

@Test
public void testNotifyBackend() {
Object data = generateData();
//stub method call
when(client.sendDataToBackend(data)).thenReturn(200);

service.notifyBackend(data);
}
}

我运行上面的单元测试,我预计 MyHttpClient 类中的 sendDataToBackend() 函数体不会被执行,因为我们已经模拟/ stub 该函数返回 200,但是我仍然看到 System.out.print() 消息:

start http request ...

来自 MyHttpClient#doHttpRequest() ,为什么?

(我的测试失败了,因为它试图做真正的 http 请求)

======更新=======

此外,我还认为我不应该在 setUp() 中执行 client = new MyHttpClient,因为 client 应该已被模拟,但是当我尝试时:

@Before
public void setUp() {
service = new MyService();
}

我在 :

中得到了 NullPointerException

when(client.sendDataToBackend(data)).thenReturn(200);,

这就是我在 setUp() 中添加 client = new MyHttpClient 的原因。我还想问一下,如果 client 被模拟了,为什么我得到了 NullPointerException

最佳答案

不是在服务中创建客户端,而是通过构造函数提供它:

class MyService {
final MyHttpClient client;
MyService(MyHttpClient client) { this.client = client; }
}

然后,在您的测试中,将模拟的客户端提供给它。就这么简单。

@RunWith(MockitoJunitRunner.class)
public class MyServiceTest {
@Mock
private MyHttpClient client;

private MyService service;

@Before
public void setUp() {
service = new MyService(client);
}
....
}

关于java - 使用 Robolectrics 和 Mockito 来模拟/ stub 函数调用发出 http 请求,但它不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33582096/

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