Junitテストで外部接続のMockをしたいのですが、
java.lang.AbstractMethodError: Missing implementation of resolved method 'abstract java.net.URLConnection openConnection(java.net.URL)' of abstract class java.net.URLStreamHandler.
が発生し上手くいきません。
環境はjdk-1.8.0、Junit5です。
以下が、Mock対象のソースになります。
public void openConnection() throws MalformedURLException, IOException { //接続するURLを指定する URL url = new URL( protocol, host, port, filePath ); //コネクションを取得する urlConn = (HttpURLConnection) url.openConnection(); urlConn.setConnectTimeout(10000); // HTTPメソッドを設定する urlConn.setRequestMethod(httpMethod); // リスエストとボディ送信を許可する urlConn.setDoOutput(true); // レスポンスのボディ受信を許可する urlConn.setDoInput(true); // コネクション接続 urlConn.connect(); // 読み込み・書き込みストリーム取得 ps = new PrintStream(urlConn.getOutputStream()); reader = new BufferedReader(new InputStreamReader(urlConn.getInputStream())); }
以下がJunitソースになります。
@PrepareForTest({ URL.class }) public class SampleTest { @Mock HttpURLConnection urlConn; @Mock PrintStream ps; @Mock BufferedReader reader; @InjectMocks Sample sample = new Sample(); @Test public void function() throws Exception{ ReserveInformation rsvinfo = new ReserveInformation(); URL u = PowerMockito.mock(URL.class); PowerMockito.whenNew(URL.class).withArguments(anyString(), anyString(), anyInt(), anyString()).thenReturn(u); HttpURLConnection huc = PowerMockito.mock(HttpURLConnection.class); PowerMockito.when(u.openConnection()).thenReturn(huc); PowerMockito.when(huc.getResponseCode()).thenReturn(200); sample.openConnection(); } }
java初心者のため、細かい説明もいただけると助かります。
よろしくお願いいたします。
追記
Gradleのバージョンは6.3で、Junit5は5.6.0、PowerMockはpowermock-mockito2-2.0.2-full.jarを使用しております。
Mockitoにつきましてはgradle.buildを見た感じ2.xだと思われます。
以下がgradle.buildになります。
私自身はgradleに明るくなく他の方に書いてもらったもののため、説明はできません。
plugins { id 'org.springframework.boot' version '2.2.6.RELEASE' id 'io.spring.dependency-management' version '1.0.9.RELEASE' id 'java' } configurations { developmentOnly runtimeClasspath { extendsFrom developmentOnly } compileOnly { extendsFrom annotationProcessor } // SLF4Jを使わない設定 all*.exclude module : 'spring-boot-starter-logging' } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-activemq' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-web-services' compileOnly 'org.projectlombok:lombok' runtimeOnly 'org.postgresql:postgresql' developmentOnly 'org.springframework.boot:spring-boot-devtools' annotationProcessor 'org.projectlombok:lombok' testImplementation('org.springframework.boot:spring-boot-starter-test') { exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' } // Log4J2を使うので追加 implementation 'org.springframework.boot:spring-boot-starter-log4j2' // OpenAPI用 implementation 'io.springfox:springfox-swagger2:2.8.0' implementation 'io.springfox:springfox-swagger-ui:2.8.0' implementation 'org.openapitools:jackson-databind-nullable:0.1.0' implementation 'org.apache.activemq:activemq-pool:5.9.0' compile fileTree(dir: 'lib', include: '*.jar') testCompile "org.mockito:mockito-core:2.+" } test { useJUnitPlatform() }
回答1件
あなたの回答
tips
プレビュー