2011-04-06 2 views
3

안녕하세요, 지난 몇일 동안이나 벽돌 벽을 치려고 노력했습니다. 이 코드를 단위 테스트 해 봅니다. 그러나 EasyMock을 사용해야하는지 아닌지 확실하지 않습니까 ?? 온라인에서 몇 가지 예를 볼 수 있지만 오래된 기술을 사용하는 것 같습니다. 의 URL이 유효을 확인하고이 방법을 조롱하려는 경우 T 또는 F.URL 연결에서 JUnit 테스트, EasyMock을 사용 하시겠습니까?

+1

이 방법을 테스트 하시겠습니까, 아니면 다른 방법을 테스트하고이 방법의 혁신을 조롱해야합니까? – Ralph

답변

2

필자는 항상 조롱 테스트를 유지하고 전체 목적을 달성하기 어려울 수 있으므로 가능한 한 많이 피할 수 있음을 관찰했습니다.

내 제안은 JUnit 자체에서 로컬 시스템에 임시 서버를 만드는 것입니다. JUnit 시작시 Java 소켓을 사용하여 서버를 만들 수 있습니다 (10-15 줄 이상의 코드가 필요하지 않음). 그런 다음 코드에서 로컬 서버의 URL을 전달합니다. 이렇게하면 조롱을 줄이고 코드 커버리지를 극대화 할 수 있습니다. 이 같은

뭔가 -

public class SimpleServer extends Thread { 

public void run() { 
    try { 
     serverSocket = new ServerSocket(port); 

      while (true) { 
      Socket s = serverSocket.accept(); 
      } 
    } 
    catch (IOException e) { 
      e.printStackTrace(); 
    } 
    finally { 
     serverSocket = null; 
    } 
} 
} 
2

을 반환에

public boolean verifyConnection(final String url) { 
    boolean result; 

    final int timeout = getConnectionTimeout(); 
    if (timeout < 0) { 
     log.info("No need to verify connection to client. Supplied timeout = {}", timeout); 
     result = true; 
    } else { 
     try { 
      log.debug("URL: {} Timeout: {} ", url, timeout); 

      final URL targetUrl = new URL(url); 
      final HttpURLConnection connection = (HttpURLConnection) targetUrl.openConnection(); 

      connection.setConnectTimeout(timeout); 
      connection.connect(); 
      result = true; 
     } catch (ConnectException e) { 
      log.warn("Could not connect to client supplied url: " + url, e); 
      result = false; 
     } catch (MalformedURLException e) { 
      log.error("Malformed client supplied url: " + url, e); 
      result = false; 
     } catch (IOException e) { 
      log.warn("Could not connect to client supplied url: " + url, e); 
      result = false; 
     } 
    } 
    return result; 
} 

그것은 단지 내가 URL이 아닌 문자열을 전달 권하고 싶습니다,의을. 메소드가 필요로하는 URL을 만들지 마라. 클라이언트가 당신을 위해 URL을 생성하고 전달하도록하십시오. 그러면 테스트가 필요하다면 테스트가 가짜로 대체 될 수 있습니다.

거의 의존성 주입 아이디어입니다. 메소드에 의존성을 부여하고 자체적으로 작성하지 않아야합니다. "new"에 대한 호출은 죽은 공짜입니다.

과감한 변화가 아닙니다. 메서드를 오버로드하고 URL 문자열을 허용하는 서명과 URL 자체를 받아들이는 서명의 두 가지 서명이있을 수 있습니다. 첫 번째 방법으로 URL을 만들고 두 번째 방법을 호출하십시오. 그런 식으로 테스트 할 수 있으며 편의상 API에 String 서명이있는 메서드를 사용할 수 있습니다.

2

는 HttpURLConnection의의 모의 구현을 설정하려고합니다. 마찬가지로

public class MockHttpURLConnection extends HttpURLConnection { '

' protected HttpURLConnection createHttpURLConnection(URL url) 
     throws IOException { 
    return (HttpURLConnection) url.openConnection(); 
} 

그래서이처럼 보이는 뭔가를 테스트 오버라이드 (override)하는 클래스에

첨가 방법 :

@Test 
public void testGetContentOk() throws Exception 
{ 
    String url = "http://localhost"; 

    MockHttpURLConnection mockConnection = new MockHttpURLConnection(); 

    TestableWebClient client = new TestableWebClient(); 
    client.setHttpURLConnection(mockConnection); 

    boolean result = client.verify(url); 

    assertEquals(true, result); 
} 

@Test 
public void testDoesNotGetContentOk() throws Exception 
{ 
    String url = "http://1.2.3.4"; 

    MockHttpURLConnection mockConnection = new MockHttpURLConnection(); 

    TestableWebClient client = new TestableWebClient(); 
    client.setHttpURLConnection(mockConnection); 

    boolean result = client.verify(url); 

    assertEquals(false, result); 
} 

/** 
* An inner, private class that extends WebClient and allows us 
* to override the createHttpURLConnection method. 
*/ 
private class TestableWebClient extends WebClient1 { 

    private HttpURLConnection connection; 

    /** 
    * Setter method for the HttpURLConnection. 
    * 
    * @param connection 
    */ 
    public void setHttpURLConnection(HttpURLConnection connection) 
    { 
     this.connection = connection; 
    } 

    /** 
    * A method that we overwrite to create the URL connection. 
    */ 
    @Override 
    public HttpURLConnection createHttpURLConnection(URL url) throws IOException 
    { 
     return this.connection; 
    } 
} 

첫 부분에 전달하지만, 거짓 더미 테스트를 위해 진정한지고 , 피드백에 대한 감사의 말, 지금까지 최고의 사이트를 찾았습니다. 올바른 방법으로 생각하면 알려주세요.

+0

Dave, 질문에 대한 응답으로 답변을 추가하지 마십시오. – duffymo