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
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,从而防止那里的输入错误。投票给了我新的想法。我也同意弗洛里安的观点。稍后将发布我的解决方案