java - 使用 Mockito 更改方法内方法的值

标签 java junit mockito

我想编写一个 Junit 测试用例来测试 else {id = null;下面代码中的语句。我想做的是查看该网站是否处于 Activity 状态,如果是,则生成一个 ID,但如果它不处于 Activity 状态(或出现故障),则将 id 返回为 null。

public static String createID() {
    String id = null;
    HttpURLConnection connection = accessProv();
    if (checkConfigs()) {
        try {
            if(checkSiteResponse(connection)) {
                id = generateID(connection);
            } else {
              //test this statement 
                id = null;
            }
        } catch (IOException e) {
          LOG.error("IOException");
        }
    } else {
        id = generateRandomID();
    }
        return id;
}

public static boolean checkConfigs() {
    return (stormConf != null && (boolean)stormConf.get(ENABLE_ID_REGISTRATION) && !((boolean)stormConf.get(SUBMIT_TOPOLOGY_LOCALLY)));

public static HttpURLConnection accessProv() {
    HttpURLConnection connection = null;
    try {
        URL url = new URL(PROV_CREATE_ID_URL);
        connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("GET");
        connection.connect();
        int code = connection.getResponseCode();
    } catch (IOException e) {
        LOG.error("IOException");
    }
    return connection;
}
    public static boolean checkSiteResponse(HttpURLConnection connection) throws IOException {
    Boolean response;
    if (connection.getResponseCode() == 200) {
        response = true;
    } else { response = false; }
    return response;
}

我使用 Mockito 编写了下面的测试用例:

@Test
public void testRequestError() throws ParseException, IOException {
    HttpURLConnection mockHttpConnection = Mockito.mock(HttpURLConnection.class);
    ProvenanceUtils provenanceUtils = Mockito.mock(ProvenanceUtils.class);
    provenanceUtils.checkSiteResponse(mockHttpConnection);
    when(provenanceUtils.checkConfigs()).thenReturn(true);
    when(provenanceUtils.accessProvenance().getResponseCode()).thenReturn(100);
    System.out.println(provenanceUtils.createID());

但我收到错误:

org.mockito.exceptions.misusing.WrongTypeOfReturnValue: 
Boolean cannot be returned by getResponseCode()
getResponseCode() should return int

我是 Mockito 新手,不知道如何将 getResponseCode 设置为 200 以外的值。我在第一个 when 语句 (when(provenanceUtils.checkConfigs) 中收到错误()).thenReturn(true);)。

基本上,我希望 checkConfigs() 返回 true,checkSiteResponse(connection) 返回 false。有没有办法用 Mockito 做到这一点?如果可以的话,我想避免使用 PowerMock。

最佳答案

请记住static methods can not be mocked with Mockito除非你使用PowerMockito .

除此之外,方法 accessProvenance() 返回的不是 mock (是实际的 HttpURLConnection 实例),因此 mockito 无法修改其行为。

您可以尝试使用 WireMock 来模拟 http 请求

@Rule
public WireMockRule wireMockRule = new WireMockRule();

...
public void testRequestError() throws ParseException, IOException {
  stubFor(post(urlEqualTo(PROV_CREATE_ID_URL))
    .willReturn(aResponse()
       .withStatus(100)));
...
}

关于java - 使用 Mockito 更改方法内方法的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38944704/

相关文章:

java - 有没有像 Observable ConcurrentLinkedDeque 这样的东西?

java - 如何在 Eclipse 中查找函数返回值未计算的所有实例?

java - 如何检查 hamcrest 集合中某些项目的大小和存在

android - 在 Android Studio 中运行单元测试时,类覆盖率和行覆盖率有什么区别?

java - 使用 Mockito/JUnit 模拟 Java 常量变量(公共(public)静态)

scala - 如何在 Scala 测试中将模拟调用与通配符匹配?

java - 如何使用 Mockito 测试 sendEmail() 方法而不发送电子邮件?

Java整数溢出

java - Eclipse 程序参数不起作用(java)?

java.lang.NoSuchMethodError : org. apache.xerces.impl.xpath.regex.RegularExpression.<init>(Ljava/lang/String;Ljava/lang/String;Ljava/util/Locale;