Unittest с Mockito - игнорировать вызов метода

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

public boolean validateFormula(String formula) {

    boolean validFormula = true;
    double result = 0;

    try {
        result = methodThatCalculatAFormula(formula, 10, 10);
    } catch (Exception e) {
        validFormula = false;
    }

    if (result == 0)
        validFormula = false;
    return validFormula;
}

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

Чтобы проверить это, я хотел бы посмотреть, как этот метод ведет себя в зависимости от того, что возвращает methodThatCalculatAFormula. Поскольку он возвращает false, когда result равно 0 и возвращает значение valid, если это любое число, кроме 0. Я хотел бы смоделировать эти возвращаемые значения без запуска фактического метода methodThatCalculatAFormula.

Я написал следующее:

public class FormlaServiceImplTest {
    @Mock
FormulaService formulaService;

@Before
public void beforeTest() {
   MockitoAnnotations.initMocks(this);
}

@Test
public void testValidateFormula() {                 

`//Valid since methodThatCalculatAFormula returns 3`    
when(formulaService.methodThatCalculatAFormula(anyString(),anyDouble(),anyDouble(),anyBoolean())).thenReturn((double)3);        
        assertTrue(formulaService.validateFormula("Valid"));    



//Not valid since methodThatCalculatAFormula returns 0
when(formulaService.methodThatCalculatAFormula(anyString(),anyDouble(),anyDouble(),anyBoolean())).thenReturn((double)0);
    assertFalse(formulaService.validateFormula("Not Valid"));
}

Однако, когда я запускаю приведенный выше код, мой assertTrue равен false. Я предполагаю, что я сделал что-то не так в моей настройке. Как бы я протестировал описанный выше метод, имитируя возвращаемое значение methodThatCalculatAFormula, фактически не вызывая его.

4 голоса | спросил John Snow 13 MarpmWed, 13 Mar 2013 20:03:41 +04002013-03-13T20:03:41+04:0008 2013, 20:03:41

2 ответа


0

То, что вы пытаетесь сделать, это не шутка, а шпион (частичная шутка). Вы не хотите издеваться над объектом, а только одним методом.

Это работает:

public class FormulaService {
    public boolean validateFormula(String formula) {

        boolean validFormula = true;
        double result = 0;

        try {
            result = methodThatCalculatAFormula(formula, 10, 10);
        } catch (Exception e) {
            validFormula = false;
        }

        if (result == 0)
            validFormula = false;
        return validFormula;
    }

    public  double methodThatCalculatAFormula(String formula, int i, int j){
        return 0;
    }
}

и

public class FormulaServiceImplTest {

    FormulaService formulaService;

    @Test
    public void testValidateFormula() {

        formulaService = spy(new FormulaService());
        // Valid since methodThatCalculatAFormula returns 3`
        doReturn((double) 3).when(
                formulaService).methodThatCalculatAFormula(anyString(),
                        anyInt(), anyInt());
        assertTrue(formulaService.validateFormula("Valid"));

        // Not valid since methodThatCalculatAFormula returns 0
        doReturn((double)0).when(
                formulaService).methodThatCalculatAFormula(anyString(),
                        anyInt(), anyInt());
        assertFalse(formulaService.validateFormula("Not Valid"));
    }
}

Но вы не должны использовать шпиона. Вы должны реорганизовать класс в два, чтобы вы могли проверить один на предмет другого.

ответил rcomblen 13 MarpmWed, 13 Mar 2013 20:21:26 +04002013-03-13T20:21:26+04:0008 2013, 20:21:26
0

Вы не можете тестировать код в классах Mocked. Если вы просто насмехаетесь над этим, все методы являются заглушками.

Вместо этого вы должны шпионить. Прочитайте документацию Mockito о том, как использовать Spy.

ответил David M. Karr 13 MarpmWed, 13 Mar 2013 20:16:46 +04002013-03-13T20:16:46+04:0008 2013, 20:16:46

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132