Как охватить метод, вызывающий статический метод, используя 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();
}
}