2015-10-15 3 views
0

Скажем, у меня есть класс, как это:Контроллинг метода вывода с Mockito

public class RegularStuff { 

    public int getAmountOfStuff() { 

     int stuff = getAmount(); 
     return stuff; 
    } 

    public int getAmount() { 
     return 10; 
    } 
} 

Теперь, скажем, у меня есть тестовый модуль, как так:

@RunWith(PowerMockRunner.class) 
public class StuffTest { 

    private RegularStuff testobject; 

    @Before 
    public void setUp() { 
     testObject = new RegularStuff(); 
    } 

    @Test 
    public void testGetAmountOfStuff() { 
     int result = testObject.getAmountOfStuff(); 
     assertEquals(5, result); 
    } 
} 

Заметим, что приведенное утверждение является недействительным. Он будет терпеть неудачу, потому что метод getAmountOfStuff вызывает другой метод, который всегда возвращает 10. Я разделил их, чтобы сделать код более простым для анализа. Это может показаться тривиальным в этом примере, но я часто нахожу, что создаю гораздо более крупные методы. Таким образом, я разделяю код в заданной функции. В противном случае чистое количество текста становится слишком большим/запутанным для анализа или исправления, не говоря уже о тестировании.

Так что мне нужно знать, как контролировать вывод определенных методов в классе, который я тестирую.

ответ

1

1) Чтобы издеваться над общедоступным методом, ниже приведен метод тестирования.

@RunWith(PowerMockRunner.class) 
public class StuffTest { 

private RegularStuff testObject; 

@Before 
public void setUp() { 
    testObject = PowerMockito.mock(RegularStuff.class, Mockito.CALLS_REAL_METHODS); 
    // The reason using CALLS_REAL_METHODS is that we are both testing & mocking same object. 
} 

// test by mocking public method 
@Test 
public void testGetAmountOfStuff() { 

    PowerMockito.when(testObject.getAmount()).thenReturn(5); 

    int result = testObject.getAmountOfStuff(); 
    Assert.assertEquals(5, result); 
} 

} 

2) Если ваш getAmount() является частным методом, Ниже приведен метод испытания издеваться частный метод.

@RunWith(PowerMockRunner.class) 
@PrepareForTest(RegularStuff.class) 
public class StuffTest { 

private RegularStuff testObject; 

@Before 
public void setUp() { 
    testObject = PowerMockito.mock(RegularStuff.class, Mockito.CALLS_REAL_METHODS); 
    // reason using CALLS_REAL_METHODS, we are both testing & mocking same object. 
} 

// test by mocking private method 
@Test 
public void testByMockingPrivateMethod() throws Exception{ 

    PowerMockito.doReturn(5).when(testObject , "getAmount"); 
    int result = testObject.getAmountOfStuff(); 
    Assert.assertEquals(5, result); 
} 
} 
+0

Это сработало. Спасибо. –

Смежные вопросы