2016-04-06 16 views
1

Betrachten Sie zwei Klassen A und B.Wie man eine Methode behandelt, die eine statische Methode aufruft, die JUnit verspottet?

class A { static int a(){} } 

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

Jetzt muss ich Klasse abdecken B JUnit-Testfall verwenden und damit erstelle ich eine neue Klasse (Klasse TestB) die Klasse B abzudecken.

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

Hier ist meine Frage, ob es eine Möglichkeit, die ich die Linie abdecken kann A.a(), da dies die statische Methode ist. Ich weiß, dass ich es nicht leicht machen kann, es zu verspotten, weil es kein Objekt gibt. Wie würde ich fortfahren? Ich benutze JUnit und EasyMock.

Antwort

2

Sie müssen PowerMock zusammen mit easymock verwenden, um sich über die statischen Methoden lustig zu machen.

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

Für Ihren Testfall Mock Code wie dies hier

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

aussehen wird, ist ein funktionierendes Beispiel statische Methode für KeyStore.getInstance Methode

KeyStoreService zu verspotten:

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

} 

Testklasse:

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

Wie Sie darauf hingewiesen haben gibt es keine Möglichkeit, eine statische Methode mit easymock zu verspotten.

Ansatz 1: Verwenden Sie möglichst keine statischen Methoden.

Ansatz 2: Verwenden Sie PowerMock über easemock.

Ansatz 3: Delegieren Sie den Körper von A.a() mit einem Lieferanten innerhalb a(). Sie können einen "einfachen" Lieferanten für Testfälle und den realen Lieferanten für den produktiven Einsatz verwenden.