2014-12-12 2 views
0

Eclipse에서 최신 버전의 junit 및 jmockit과 Oracle JDK 7을 사용하고 있습니다. java.net.URL을 모의하려고 할 때 내 테스트가 실행되지 않습니다. 내가 좋아하는 내 코드에 뭔가가JMockit 조킹 java.net.URL로 인해 테스트가 실행되지 않습니다.

:

URL url = new URL("String representing the url."); 

그래서 내가 내 테스트에 생각 나는과 같이이 조롱 수 :

@Mocked private URL _url; 

를이 다른 거의 모든 작동하기 때문에, 내가 아는 URL은 최종적이지만 JMockit은 괜찮다고 생각했습니다.

위의 mock을 사용하여 테스트 클래스를 실행하면 결과가 녹색 또는 빨간색과 반대되는 회색 선이됩니다. 따라서 초기화 문제가 있다고 가정합니다. 테스트 나 코드의 나머지 부분은 내가 뭘했는지에 상관없이 아무렇지 않은 것처럼 보입니다.

해결 방법이 좋을 수 있습니다. 실제로이 문제를 일으키는 원인에 대한 설명이 더 좋습니다. 어떤 도움이라도 대단히 감사합니다! 감사!

빠른 예. 이것은 실제로 예외를 제공하지만, 나는 기본적으로 같은 내가 본 것하고 있다고 생각한다 :

package demo; 

import java.io.IOException; 
import java.net.HttpURLConnection; 
import java.net.URL; 

public class Connecting { 
    public boolean connectionattempt() throws IOException { 
    URL url = new URL("http://nowhere/"); 
    HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
     if (connection != null) { 
      return true; 
     } 
     else { 
      return false; 
     } 
    } 
} 

그리고이 테스트 :

package demo; 

import static org.junit.Assert.assertEquals; 

import java.io.IOException; 
import java.net.HttpURLConnection; 
import java.net.URL; 

import org.junit.Test; 
import mockit.Expectations; 
import mockit.Mocked; 
import mockit.Tested; 

public class TestConnecting { 
    @Mocked URL _url; 
    @Mocked HttpURLConnection _connection; 
    @Tested Connecting _sut; 

    @Test 
    public void testConnect() throws IOException { 
     new Expectations() { { 
      _url.openConnection(); result = _connection; 
     } }; 
     assertEquals(true, _sut.connectionattempt()); 
    } 
} 

및 스택 추적 :

java.lang.NoClassDefFoundError: org/eclipse/jdt/internal/junit/runner/TestReferenceFailure 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestListener.testFailure(JUnit4TestListener.java:91) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestListener.testFailure(JUnit4TestListener.java:69) 
    at org.junit.runner.notification.RunNotifier$4.notifyListener(RunNotifier.java:139) 
    at org.junit.runner.notification.RunNotifier$SafeNotifier.run(RunNotifier.java:61) 
    at org.junit.runner.notification.RunNotifier.fireTestFailures(RunNotifier.java:134) 
    at org.junit.runner.notification.RunNotifier.fireTestFailure(RunNotifier.java:128) 
    at org.junit.internal.runners.model.EachTestNotifier.addFailure(EachTestNotifier.java:23) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:315) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) 
+0

'URL' 객체를 조롱 할 때 많은 이점을 볼 수 없습니다. 왜 단지 구체적인 것을 만들지 않는 것일까 요? 회색 선이 나타나면 예외가 발생 했어야합니다. 해당 스택 추적을 게시 할 수 있습니까? 사실, 문제를 보여주기 위해 컴파일 가능한 예제를 게시 할 수 있습니까? –

+0

일반적으로 우리는 테스트중인 시스템이 아닌 모든 객체를 조롱하려고합니다. url.openConnection()이 호출되면 조롱 된 HttpURLConnection을 반환하기 위해 URL 객체를 조롱하는 특정 이점이 있습니다. 내가 그것을 실행할 때 아무런 예외 나 스택 트레이스를 볼 수 없으며, 테스트가 초기화되지 않은 것처럼 실패하지 않습니다. 시간이 있기 때문에 나는 연결 설정 방법을 변경하고 구체적인 URL을 사용하겠습니다. 나는 이것이 모의 이유가 될지 궁금했다. 나는 JMockit이 그것을 모방하기 위해 변경되기 전에 JVM에서 URL 초기화에 대해 언급 한 포럼 게시물을 보았습니다. – Pewsplosions

+0

실수로'openConnection()'을 잊어 버렸습니다. 당신이 설명하는 방식대로 실패하는 간단한 예제 테스트를 게시 할 수 있습니까? 어떤 이유로이 문제를 해결할 수 없다고 가정하면'URL' 객체를 모의 할 수있는 클래스에 캡슐화 할 수 있습니다. –

답변

0

을 JMockit 1.13, JUnit 4.11 및 Oracle JDK 1.7.0_67을 사용하여 Eclipse Kepler SR2, IntelliJ IDEA 13.1 및 Netbeans 8.0.1에 대한 테스트를 수행했습니다.

모든 경우에 테스트가 통과합니다. 모두 초록색입니다! 그래서, 나는 아마도 당신의 환경에서 어떤 문제가 될 수 있는지 모른다. JMockit의 "최신 버전"(현재 1.13)이 실제로 사용 되었습니까?

+0

확실히 1.13입니다. 내 환경에서 뭔가 있어야합니다. 나는 아무것도 알지 못한다면 다시 돌아올 것이고 어떤 업데이트를 언급 할 것이지만 나는 약간의 물건을 바꿔서이 문제를 해결했다. 그래서 내가 언제 다시 돌아올 지 확신 할 수 없다. 그래서 저는 지금 이것을 대답으로 받아 들일 것입니다. 감사. – Pewsplosions

관련 문제