我有以下代码:
class Hd {
public Hd() {
try {
this.hName = InetAddress.getLocalHost().getHostName();
} catch (UnknownHostException e){
this.setHName("unk-host");
}
}
}
如何为该构造函数抛出异常的部分编写单元测试用例?
因为这需要
InetAddress.getLocalHost().getHostName()
抛出异常,这可能会也可能不会自然发生。这就像确保这总是抛出异常。
您可以使用依赖注入模式来完成它。
例如,如果您创建了一个类似以下的界面:
public interface HostNameSupplier {
String getHostName() throws UnknownHostException;
}
如果您创建了该接口的默认实现,例如:
public class DefaultHostNameSupplier implements HostNameSupplier {
@Override
public String getHostName() throws UnknownHostException {
return InetAddress.getLocalHost().getHostName();
}
}
然后可以设置您的
Hd
类,以便可以将 HostNameSupplier
“注入”到其中。
public class Hd {
private final String hName;
public Hd(final HostNameSupplier hostNameSupplier) {
String hostName;
try {
hostName = hostNameSupplier.getHostName();
} catch (UnknownHostException e) {
hostName = "unk-host";
}
this.hName = hostName;
}
}
在您的真实代码中,您可以将新的 DefaultHostNameSupplier() 注入到您的
Hd
实例中,但在您的测试中,您可以创建该接口的假实现来抛出异常:
@Test
void shouldSetHNameToDefaultValueWhenUnknownHostExceptionThrown() {
final Hd hd = new Hd(new HostNameSupplierThatThrowsException());
assertEquals("unk-host", hd.getHName());
}
static class HostNameSupplierThatThrowsException implements HostNameSupplier {
@Override
public String getHostName() throws UnknownHostException {
throw new UnknownHostException();
}
}