2016-04-06 9 views
1

İki sınıf A ve B'u düşünün.JUnit alayını kullanarak statik bir yöntemi çağıran bir yöntem nasıl gizlenir?

class A { static int a(){} } 

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

Şimdi JUnit Testi durumda kullanarak sınıf B kapsayacak zorunda ve dolayısıyla ben sınıf B kapsayacak şekilde yeni bir sınıf (class TestB) oluşturun. Bu statik yöntem olduğu gibi çizgiyi A.a() kapsayacak bir yolu var olup olmadığını

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

benim sorudur. Ben bunu alay edemediğimi biliyorum çünkü hiçbir nesne söz konusu değil. Peki nasıl devam edeyim? JUnit ve EasyMock kullanıyorum.

cevap

2

Statik yöntemleri alay etmek için PowerMock'u easymock ile birlikte kullanmanız gerekecektir.

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"); 
    } 

} 
: En test için

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

sahte kod İşte bu

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

gibi görünecek KeyStore.getInstance yöntemle

KeyStoreService için statik yöntemini alay etmek bir çalışma örneğidir

Test sınıfı:

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

Belirttiğiniz gibi, statik bir yöntemi easymock ile karıştırmanın bir yolu yoktur.

Yaklaşım 1: Mümkün olduğunda statik yöntemleri kullanmayın.

Yaklaşım 2: PowerMock'ı easymock'un üzerine kullanın.

Yaklaşım 3: a() içinde bir tedarikçi kullanarak A.a() gövdesini yetkilendirin. Üretken kullanım için test çantaları ve gerçek dünya tedarikçisi için "basit" bir tedarikçi kullanabilirsiniz.

İlgili konular