Как охватить метод, вызывающий статический метод, используя JUnit mocking?

Рассмотрим два класса A а также B,

class A {  static int a(){} }

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

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

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

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

2 ответа

Как вы указали, нет способа смоделировать статический метод с помощью easymock.

Подход 1. Не используйте статические методы везде, где это возможно.

Подход 2: Используйте PowerMock поверх easymock.

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

Вам придется использовать 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();
    }
}
Другие вопросы по тегам