2016-04-06 8 views
1

2つのクラスABを考えてみましょう。JUnitモッキングを使用して静的メソッドを呼び出すメソッドをカバーする方法は?

class A { static int a(){} } 

class B { void something(){ int value=A.a(); .......}} 

は今はJUnitテストケースを使用して、クラスBをカバーしなければならない、したがって、I、クラスBをカバーするために、新しいクラス(クラスTestB)を作成します。

class TestB { @Test public void testsomething(){...} } 

これは静的メソッドであると私はラインA.a()をカバーすることができますどのような方法がある場合はここに私の質問です。私は、オブジェクトが含まれていないので、簡単に嘲笑することができないことを知っています。だから私はどのように進むだろうか? 私はJUnitとEasyMockを使用しています。

答えて

2

静的メソッドをモックするには、easymockと一緒にPowerMockを使用する必要があります。テストケースモックコードについては

https://github.com/jayway/powermock/wiki/MockStatic

ここでは、この

KeyStore aMock = PowerMockito.mock(A.class); 
PowerMockito.when(A.a()).thenReturn(0); 

のようになります。KeyStore.getInstance方法

KeyStoreServiceのための静的メソッドを模擬する作業例です:

package com.foo; 

import java.io.IOException; 
import java.security.KeyStore; 
import java.security.KeyStoreException; 
import java.security.NoSuchAlgorithmException; 
import java.security.cert.CertificateException; 


public class KeyStoreService { 

    public KeyStoreService(){ 

    } 

    public void load() throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException{ 
     System.out.println("start"); 
     KeyStore ks = KeyStore.getInstance(""); 
     ks.load(null, null); 
     System.out.println("end"); 
    } 

} 

試験クラス:

package com.foo.test; 

import java.io.IOException; 
import java.io.InputStream; 
import java.security.KeyStore; 
import java.security.KeyStoreException; 
import java.security.NoSuchAlgorithmException; 
import java.security.NoSuchProviderException; 
import java.security.cert.CertificateException; 

import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.mockito.Matchers; 
import org.mockito.Mockito; 
import org.powermock.api.mockito.PowerMockito; 
import org.powermock.core.classloader.annotations.PrepareForTest; 
import org.powermock.modules.junit4.PowerMockRunner; 

import com.foo.KeyStoreService; 

@PrepareForTest(KeyStoreService.class) 
@RunWith(PowerMockRunner.class) 
public class TestKeyStore { 

    @Test 
    public void test1() throws KeyStoreException, NoSuchProviderException, NoSuchAlgorithmException, CertificateException, IOException{ 
     PowerMockito.mockStatic(KeyStore.class); 
     KeyStore keyStoreMock = PowerMockito.mock(KeyStore.class); 
     KeyStoreService kss = new KeyStoreService(); 
     PowerMockito.when(KeyStore.getInstance(Matchers.anyString(), Matchers.anyString())).thenReturn(keyStoreMock); 
     Mockito.doNothing().when(keyStoreMock).load(Mockito.any(InputStream.class), Mockito.any(char[].class)); 
     kss.load(); 
    } 
} 
1

あなたが指摘したように、静的メソッドをeasymockでモックする方法はありません。

アプローチ1:可能な限り静的メソッドを使用しないでください。

アプローチ2:easockockの上にPowerMockを使用します。

アプローチ3:のサプライヤを使用してA.a()の本文を委任する。テストケースには「シンプルな」サプライヤを使用し、生産的な使用には現実のサプライヤを使用することはできません。

関連する問題