2017-10-11 140 views
0

類的值:下的Mockito測試嘲笑的方法

class FruitQuality { 

    void testQuality() { 
    getfruits(); 
    //some code 
    } 

    List<Fruits> getfruits() { 
    return orange; 
    } 
} 

下面是測試代碼。我嘲笑了被測試的類,重寫了getfruits方法的返回值。但是當我運行模擬時,我沒有得到預期的模擬返回值。 Easymock可以替換被測試類的方法返回值,如果這些被明確地模擬。當我嘲笑實物對象方法時,如何獲得嘲諷的返回值。

@Test 
public void test() { 
    Fruits fruit= new Fruits(); 
    fruit.setFruit("orange"); 
    List<Fruits> fruitsList = new ArrayList<Fruits>(); 
    fruitsList.add(fruit); 

    Fruits mock = Mockito.mock(FruitQuality.class) 
    classUnderTest = new FruitQuality(); 
    when(mock.getfruits()).thenReturn(fruitsList); 

    result= classUnderTest.getfruits(); 
    assertEquals(result, fruitsList); 
} 
+0

是我們的assertEquals是否正確?它要求'結果'但沒有變量'結果' – schneida

+2

你爲什麼要模擬被測試的類?你通常嘲笑被測試類的依賴關係 –

+1

請確保你的代碼是有點真實的Java代碼,你的'getfruits()'方法使用兩個'return'語句返回兩個值。這在Java中不存在...... – schneida

回答

0

通常,編寫單元測試時,你必須在包含要測試的實現代碼測試一個類,而嘲笑下測試你的類是依靠其他類的梅索德。

關於你例子中,你將有一個類

public class FruitQuality { 
    private FruitProvider fruitProvider; 

    public List<Fruit> testQuality() { 
     List<Fruit> fruits = fruitProvider.getfruits(); 
     /* Some code doing something with fruits, e.g., filtering. */ 
     return fruits; 
    } 
} 

而第二類現在

public class FruitProvider { 
    public List<Fruits> getfruits() { 
     /* Returning some fruits ... */ 
    } 
} 

,你可以嘲笑你的供應商下測試,測試類:

@RunWith(MockitoJUnitRunner.class) 
public class FruitQualityUnitTest { 
    @InjectMocks 
    private FruitQuality fruitQuality; 
    @Mock 
    private FruitProvider fruitProvider; 

    @Test 
    public void testQuality() { 
     /* Mocking the provider. */ 
     Fruits fruit= new Fruits(); 
     fruit.setFruit("orange"); 
     List<Fruits> fruitsList = new ArrayList<Fruits>(); 
     fruitsList.add(fruit); 
     when(fruitProvider.getFruits()).thenReturn(fruitsList); 

     /* Invoke the method under test. */ 
     List<Fruits> result = fruitProvider.testQuality(); 

     /* Assert that some methods where called. */ 
     verify(fruitProvider, times(1)).getFruits(); 

     /* If the method would return a value, you can do some assertions based on the mocked method calls. */ 
     assertEquals(result, fruitsList); 
    } 
} 

如果要測試您正在模擬的同一對象的方法,則可以使用@Spy註釋代替o f @Mock,確保只有你明確地模仿做原始實現以外的其他事情的方法。