回覆列表
-
1 # 使用者9898301904577
-
2 # 藍風24
因為Mockito使用繼承的方式實現mock的,用CGLIB生成mock物件代替真實的物件進行執行,為了mock例項的方法,你可以在subclass中覆蓋它,而static方法是不能被子類覆蓋的,所以Mockito不能mock靜態方法。
但PowerMock可以mock靜態方法,因為它直接在bytecode上工作,類似這樣:
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.testng.PowerMockTestCase;
import org.testng.Assert;
import org.testng.annotations.Test;
@PrepareForTest(AbstractAnimal.class)
public class AbstractAnimalTest extends PowerMockTestCase {
因為Mockito使用繼承的方式實現mock的,用CGLIB生成mock物件代替真實的物件進行執行,為了mock例項的方法,你可以在subclass中覆蓋它,而static方法是不能被子類覆蓋的,所以Mockito不能mock靜態方法。但PowerMock可以mock靜態方法,因為它直接在bytecode上工作,類似這樣:import org.powermock.api.mockito.PowerMockito;import org.powermock.core.classloader.annotations.PrepareForTest;import org.powermock.modules.testng.PowerMockTestCase;import org.testng.Assert;import org.testng.annotations.Test;@PrepareForTest(AbstractAnimal.class)public class AbstractAnimalTest extends PowerMockTestCase {@Testpublic void shouldGetMockedHello() {PowerMockito.mockStatic(AbstractAnimal.class);PowerMockito.when(AbstractAnimal.getHello()).thenReturn("Hello mocked animal world!");String greetings = AbstractAnimal.getHello();Assert.assertTrue(greetings.equals("Hello mocked animal world!"));}}