簡體   English   中英

Java - 構造函數單元測試

[英]Java - Constructor Unit testing

我有以下 Java 配置類,我需要使用 JUnit 對其進行單元測試:

public class Config {

private static final String AMQ_CONNECTION_URL_TEMPLATE = "failover:(%s)";
private final String awsAmqUrl;

public Config(String url, Optional<String> amqConnectionOptions, PropertiesManager propertiesManager) {
    String urlParameter = propertiesManager.getStringParameter(url);
    this.awsAmqUrl = constructAmqConnectionString(urlParameter, amqConnectionOptions);
}

private String constructAmqConnectionString(String urlParameter, Optional<String> connectionOptions) {
    if (connectionOptions.isPresent()) {
        urlParameter = Stream.of(urlParameter.split(","))
                .map(url -> url + "?" + connectionOptions.get())
                .collect(Collectors.joining(","));
    }
    return String.format(AMQ_CONNECTION_URL_TEMPLATE, urlParameter);
}

public ConnectionFactory getConnectionFactory() {
    ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(awsAmqUrl);
    return connectionFactory;
}
}

我正在努力為constructAmqConnectionString方法單元測試找到最佳解決方案,因為它被標記為私有。 我試圖涵蓋 3 個場景:

  • urlParameter - 包含逗號分隔的 URL (url1,url2), connectionOptions不為空;
  • urlParameter - 包含逗號分隔的 URL (url1,url2), connectionOptions為空;
  • urlParameter - 包含單個 URL (url1), connectionOptions不為空。

當前的解決方案是在awsAmqUrl字段的 Config 類中添加一個 getter,以便可以驗證/測試構造函數調用的邏輯:

public String getAwsAmqUrl() {
    return this.awsAmqUrl;
}

測試本身有以下邏輯:

@Test
public void verifyConstructorWithoutMqOptionsMultiBroker() {
    when(propertiesManager.getStringParameter(any())).thenReturn("url1,url2");
    Optional<String> amqConnectionOptions = Optional.empty();
    config = new Config("url1,url2", amqConnectionOptions, propertiesManager);
    assertEquals(String.format("failover:(url1,url2)"),config.getAwsAmqUrl());
}

@Test
public void verifyConstructorWithMqOptionsMultiBroker() {
    when(propertiesManager.getStringParameter(any())).thenReturn("url1,url2");
    Optional<String> amqConnectionOptions = Optional.of("optionTest=1");
    config = new Config("url1,url2", amqConnectionOptions, propertiesManager);        
    assertEquals(String.format("failover:(url1?%1$s,url2?%1$s)",amqConnectionOptions.get()),config.getAwsAmqUrl());
}

@Test
public void verifyConstructorWithMqOptionsSingleBroker() {
    when(propertiesManager.getStringParameter(any())).thenReturn("url1");
    Optional<String> amqConnectionOptions = Optional.of("optionTest=1");
    config = new Config("url1", amqConnectionOptions, propertiesManager);                
    assertEquals(String.format("failover:(url1?%1$s)",amqConnectionOptions.get()),config.getAwsAmqUrl());
}

僅僅為了單元測試的目的添加一個 getter 感覺不是正確的做法,因為它破壞了封裝。 在這種情況下是否有更好的方法來進行測試?

您的類使用awsAmqUrl的唯一位置是在getConnectionFactory方法中。 所以看起來這是您必須使用的方法,以確保awsAmqUrl的值正確。 因此,不要使用awsAmqUrl的吸氣劑,而是使用類似的東西

String storedUrl = objectUnderTest.getConnectionFactory().getBrokerUrl();

然后您可以對該 URL 進行斷言。

當然,它使您的測試依賴於ActiveMQConnectionFactory的行為——但這沒關系,因為您的類無論如何都與該特定類緊密耦合。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM