Mockito中的@Mock和@Spy如何使用


相同點

spy和mock生成的對象不受spring管理

不同點

1.默認行為不同

對於未指定mock的方法,spy默認會調用真實的方法,有返回值的返回真實的返回值,而mock默認不執行,有返回值的,默認返回null

2.使用方式不同

Spy中用when...thenReturn私有方法總是被執行,預期是私有方法不應該執行,因為很有可能私有方法就會依賴真實的環境
Spy中用doReturn..when才會不執行真實的方法。

mock中用 when...thenReturn 私有方法不會執行

3.代碼統計覆蓋率不同
@spy使用的真實的對象實例,調用的都是真實的方法,所以通過這種方式進行測試,在進行sonar覆蓋率統計時統計出來是有覆蓋率;
@mock出來的對象可能已經發生了變化,調用的方法都不是真實的,在進行sonar覆蓋率統計時統計出來的Calculator類覆蓋率為0.00%。

以下為測試代碼部分


 

Calculator.java
class Calculator {
    private int sumXX(int a, int b) {
        System.out.println("sumXX");
        return a + b;
    }

    public int callSumXX(int a, int b) {
        System.out.println("callSumXX");
        return  sumXX(a, b);
    }
}
SpyAndMockTest.java
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.anyInt;

@RunWith(PowerMockRunner.class)
@PrepareForTest({Calculator.class})
public class SpyAndMockTest {
   
    @Test
    public void testSumXXBySpy_Call_Private_Method() throws Exception {
        Calculator cal= PowerMockito.spy(new Calculator());
        PowerMockito.when(cal,"sumXX",anyInt(),anyInt()).thenReturn(2);
        assertEquals(2, cal.callSumXX(1, 2));
    }

   
    @Test
    public void testSumXXBySpy_Not_Call_Private_Method() throws Exception {
        Calculator cal= PowerMockito.spy(new Calculator());
        PowerMockito.doReturn(2).when(cal,"sumXX",anyInt(),anyInt());
        assertEquals(2, cal.callSumXX(1, 2));
    }

    @Test
    public void testSumXXByMock_Not_Call_Real_Method() throws Exception {
        Calculator cal= PowerMockito.mock(Calculator.class);
        PowerMockito.when(cal,"sumXX",anyInt(),anyInt()).thenReturn(2);
        assertEquals(0, cal.callSumXX(1, 2));
    }
    @Test
    public void testSumXXByMock_Call_Real_Method() throws Exception {
        Calculator cal= PowerMockito.mock(Calculator.class);
        PowerMockito.when(cal,"sumXX",anyInt(),anyInt()).thenReturn(2);
        PowerMockito.when(cal.callSumXX(anyInt(),anyInt())).thenCallRealMethod();//指明callSumXX調用真實的方法
        assertEquals(2, cal.callSumXX(1, 2));
    }
}

 

附上 pom.xm文件依賴

      <dependency>
            <groupId>org.powermock</groupId>
            <artifactId>powermock-api-mockito2</artifactId>
            <version>2.0.0-beta.5</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.powermock</groupId>
            <artifactId>powermock-core</artifactId>
            <version>2.0.0-beta.5</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.powermock</groupId>
            <artifactId>powermock-module-junit4</artifactId>
            <version>2.0.0-beta.5</version>
            <scope>test</scope>
        </dependency>

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM