2016-12-12 3 views
1

을 가지고 나는 객체 같이 있습니다스칼라 : 내 스칼라 개체를 Moking 외부 의존성

// I want to test this Object 
object MyObject { 

    protected val retryHandler: HttpRequestRetryHandler = new HttpRequestRetryHandler { 
    def retryRequest(exception: IOException, executionCount: Int, context: HttpContext): Boolean = { 
     true // implementation 
    } 
    } 

    private val connectionManager: PoolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager 
    val httpClient: CloseableHttpClient = HttpClients.custom 
    .setConnectionManager(connectionManager) 
    .setRetryHandler(retryHandler) 
    .build 

    def methodPost = { 
    //create new context and new Post instance 
    val post = new HttpPost("url") 
    val res = httpClient.execute(post, HttpClientContext.create) 
    // check response code and then take action based on response code 
    } 

    def methodPut = { 
    // same as methodPost except use HttpPut instead HttpPost 
    } 

} 

내가 세션 객체와 같은 종속 개체를 조롱하여이 객체를 테스트 할. 이것을 달성하는 방법? 나는 Mokito 또는 더 나은 방법을 사용하여 그것을 할 수 있습니까? 경우 예. 방법? 이 클래스의 디자인이 더 좋습니까?

답변

0

문제는 다음과 같습니다. 테스트하기 어려운 코드를 만들었습니다. here을 참조하면 왜 그런지 이해할 수있는 동영상을 볼 수 있습니다.

짧은 대답 : 생산 코드에서 을 직접 호출하면 테스트가 더 어려워집니다. 당신은 Mockito 스파이를 사용할 수 있습니다 (어떻게 작동하는지에 대해서는 here을보십시오).

하지만 더 좋은 대답은 제작 코드를 다시 작성하는 것입니다. 예를 들어 의존성 주입을 사용합니다. 의미 : 클래스가 필요로하는 객체를 만드는 대신 (을 사용하여) ... 클래스는 어딘가에서 개체를받습니다.

전형적인 (자바) 방식이 될 것 같은 뭔가 : 즉

public MyClass() { this (new SomethingINeed()); } 

MyClass(SomethingINeed incoming) { this.somethign = incoming; } 

: 정상적인 사용 경로가 여전히 직접 새로운를 호출; 단위 테스트의 경우 을 삽입하는 데 사용할 수있는 대안 생성자를 제공합니다. 테스트 대상 클래스가 종속되어 있습니다.

+0

나는 의존성 주입을 생각했지만 구현 방법을 알 수 없었다. 내가 가진 한 가지 접근법은 각 메소드에 대한 매개 변수로 httpClient를 사용하는 것이 었습니다 (객체 클래스는 Java와 마찬가지로 스칼라에서 생성자를 가질 수 없기 때문에 Put 및 Post는 여전히 새로 작성됩니다). 그러나이 경우 재 시도 및 기타 실패에 대한 제어가 느슨해집니다 케이스 취급. –