2016-04-06 11 views
1

Рассмотрите два класса: A и B.Как покрыть метод, вызывающий статический метод с использованием JUnit mocking?

class A { static int a(){} } 

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

Теперь я должен охватывать класс B с использованием JUnit Test случай и, следовательно, создать новый класс (класс TestB), чтобы покрыть класс B.

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

Вот мой вопрос, есть ли способ я могу покрыть линию A.a(), как это статический метод. Я знаю, что я не могу легко издеваться над ним, потому что нет объекта. Итак, как я могу продолжить? Я использую JUnit и EasyMock.

ответ

2

Вам нужно будет использовать PowerMock вместе с easymock, чтобы издеваться над статическими методами.

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: Используйте PowerMock поверх easymock.

Подход 3: Делегировать тело A.a() с использованием поставщика внутри a(). Вы можете использовать «простой» поставщик тестовых корпусов и поставщика реального мира для продуктивного использования.