编写 Junit 测试用例来测试 catch 子句

问题描述 投票:0回答:1

我有以下代码:

class Hd {
  public Hd() {
     try {
       this.hName =  InetAddress.getLocalHost().getHostName();
     } catch (UnknownHostException e){
       this.setHName("unk-host");
     }
  } 
}
  

如何为该构造函数抛出异常的部分编写单元测试用例?
因为这需要

InetAddress.getLocalHost().getHostName()
抛出异常,这可能会也可能不会自然发生。这就像确保这总是抛出异常。

java junit5
1个回答
0
投票

您可以使用依赖注入模式来完成它。

例如,如果您创建了一个类似以下的界面:

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();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.