Java 为带有最终类、void方法和exception的小方法创建测试

Java 为带有最终类、void方法和exception的小方法创建测试,java,testing,junit,mockito,Java,Testing,Junit,Mockito,我是测试自动化的新手(Mockito,JUnit),我不知道如何测试下面的类。方法中有最终类、空洞和异常,这使得它非常困难 private final static String SERVER="http://testserver:9086"; private void checkServerr() throws myException { try { URL hp = new URL(SERVER); URLConnection hpCon = hp.o

我是测试自动化的新手(
Mockito
JUnit
),我不知道如何测试下面的类。方法中有最终类、空洞和异常,这使得它非常困难

private final static String SERVER="http://testserver:9086";
private void checkServerr() throws myException {
    try {
        URL hp = new URL(SERVER);
        URLConnection hpCon = hp.openConnection();
        hpCon.connect();
    } catch (Exception e) {
        throw new myException("Server " + SERVER + " not available");
    }
}

要使其可测试,首先需要对其进行一点折射:

private void checkServerr() throws myException {
    return checkServer(SERVER);
}

protected void checkServer(String server) throws my exception {
    try {
        URL hp = new URL(server);
        URLConnection hpCon = hp.openConnection();
        hpCon.connect();
    } catch (Exception e) {
        throw new myException("Server " + server + " not available");
    }
}
现在您可以测试将服务器地址作为字符串的新的受保护方法

我在这里只看到两件事需要测试:

  • 连接成功。您需要一个虚拟服务器来实现这一点
  • 连接失败,预期出现异常myException

在阅读了雅诺斯的答案后,我想到了以下几点

在服务类中集成URLConnection的创建,
MyService.java

public class MyService {
    private static final String MYSERVER = "http://testserver:9086";

    public URLConnection createConnection(Properties properties) throws MalformedURLException, IOException {
        return new URL(MYSERVER).openConnection();
    }
}
public class myClass {
    private URLConnection serverConnection;
    private void checkServer() throws myException  {
        MyService service = new MyService();
        try {
            serverConnection = service.createConnection();
            serverConnection.connect();
        } catch (Exception e) {
             throw new myException("Server " + SERVER + " not available");
        }
    }
}
然后是myinitial类
myClass.java

public class MyService {
    private static final String MYSERVER = "http://testserver:9086";

    public URLConnection createConnection(Properties properties) throws MalformedURLException, IOException {
        return new URL(MYSERVER).openConnection();
    }
}
public class myClass {
    private URLConnection serverConnection;
    private void checkServer() throws myException  {
        MyService service = new MyService();
        try {
            serverConnection = service.createConnection();
            serverConnection.connect();
        } catch (Exception e) {
             throw new myException("Server " + SERVER + " not available");
        }
    }
}
测试将是:

@Mock
private URLConnection serverConnection;

@Before
public void setUp() throws Exception {
    MockitoAnnotations.initMocks(this);
}

@Test
public void testCheckInfrastructure() throws myException,
        IOException {
    Mockito.doNothing().when(serverConnection).connect();
    myClass.checkServer();
}

@Test(expected = myException.class)
public void testCheckServerException() throws myException, IOException {

    Mockito.doThrow(myException.class).when(serverConnection).connect();
    myClass.checkServer();
}

您可以在单独的测试用例中测试所有可能的代码路径(不要与测试类混淆)。使用EclEmma这样的工具将帮助您更多地了解代码覆盖率的概念。@MarkW+1,谢谢您的工具!我安装并使用了它。它提供的信息似乎与RAD中包含的信息相同(Eclipse似乎没有)。Richt单击项目-->属性-->代码覆盖率-->启用代码覆盖率。然后运行测试,看看对个人的影响如何,我会把整个事情分解成更多的方法。例如,URL创建是独立的,并且对于代码中可能存在的每个预定义常量值都可能失败,因此最好能够单独进行测试,例如使用方法
createUrl(String)一个单元测试可以确保每个字符串url常量实际上都是一个有效的url,从而防止那里的输入错误。投票给了我新的想法。我也同意弗洛里安的观点。稍后将发布我的解决方案