[英]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.