我有以下 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不為空。
當前的解決方案是在欄位的 Config 類中添加一個 getter,awsAmqUrl以便可以驗證/測驗建構式呼叫的邏輯:
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 感覺不是正確的做法,因為它破壞了封裝。在這種情況下是否有更好的方法來進行測驗?
uj5u.com熱心網友回復:
您的類使用的唯一位置awsAmqUrl是getConnectionFactory方法中。所以看起來這是您必須使用的方法,以確保 的值awsAmqUrl是正確的。因此,不要使用 getter awsAmqUrl,而是使用類似的東西
String storedUrl = objectUnderTest.getConnectionFactory().getBrokerUrl();
然后您可以對該 URL 進行斷言。
當然,它使您的測驗依賴于ActiveMQConnectionFactory- 的行為,但這沒關系,因為您的類無論如何都與該特定類緊密耦合。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/484650.html
