gpt4 book ai didi

java - 如何模拟静态变量,该变量是通过对该静态变量的静态方法调用来初始化的

转载 作者:行者123 更新时间:2023-12-01 06:01:27 28 4
gpt4 key购买 nike

以下带有单例的简化客户端包装类 Client需要使用 JMockit

进行 单元测试
public class ClientWrapper {
private static Client client = ClientBuilder
.build()
.setProperty("prop1", value);

public void request(String val) {
client.target(getfullURL(val)).invoke();
}
public String getFullURL(String requestMappingValue) {
return "http://xxxxx" + requestMappingValue;
}
}

我尝试使用jmockit 1.18编写单元测试

public class ClientWrapperTest {
@Tested private ClientWrapper tested;
@Mocked private Client clientMock;
@Mocked private Target targetMock;
@Test
public void testRequest() {
//Partial mock on Client class
new Expectations(Client.class) {{
ClientBuilder.build();
result = clientMock;

}};
//Partial mock on tested ClientWrapper
new Expectations(tested) {{
tested.getFullRUL(anyString);
result = anyString;
}};
//Last mock
new Expectations() {{
clientMock.target(anyString);
result = targetMock;
targetMock.invoke();
times = 1;
}};
tested.request("/test");
}
}

问题:clientMock未成功返回导致本次测试失败

问题:如何模拟静态方法调用 - ClientBuilder.build() ,然后继续利用模拟结果Client实例来模拟client.invoke()

最佳答案

问题中显示的测试过于复杂,并且滥用了模拟 API。测试的正确版本如下所示:

public final class ClientWrapperTest {
@Tested ClientWrapper tested;

@Test
public void onRequestCreateAndInvokeTargetURL(@Mocked Client clientMock) {
tested.request("/test");

new Verifications() {{
clientMock.target("http://xxxxx/test").invoke(); times = 1;
}};
}

@Test // assuming "Client" doesn't need to be mocked
public void onRequestInvokeTargetURL(@Mocked Target targetMock) {
tested.request("/test");

new Verifications() {{ targetMock.invoke(); times = 1; }};
}
}

上面的两个测试都应该通过,除非 ClientBuilder 做了一些意外的事情。

关于java - 如何模拟静态变量,该变量是通过对该静态变量的静态方法调用来初始化的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57831482/

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