Mockito - Убедитесь, что метод stati c внутри метода Object вызывается - PullRequest
1 голос
/ 26 марта 2020

У меня есть проблема, подобная этой

public class ErrorLog {
     public static void increment(String exception) {
          // do something
     }
}

import ErrorLog;
public class Calculator {
     public int division(int a, int b) {
          if (b == 0) {
               ErrorLog.increment("Divide by Zero");
          } else {
               return a / b;
          }
     }
}

Я хочу проверить количество вызовов для деления, но когда у меня есть ситуация деления на ноль, каким-то образом убедитесь, что статический c метод ErrorLog.increment вызывается (с точной строкой в ​​качестве параметра).

С шпионом Mockito я могу сделать что-то подобное, чтобы обеспечить вызов метода разделения.

Calculator c = new Calculator();
Calculator calcSpy = spy(c);

c.division(6, 3);
c.division(1, 0);

verify(calcSpy, times(2)).division(anyInt(), anyInt());

Я также заинтересован в проверке что-то вроде этого

verify(ErrorLog, times(1)).increment("Divide by Zero");

Я исследовал конструкции PowerMockito verifyStati c и mockStati c, также проверил это вызов метода mockito verify внутри метода , но в моем случае это метод, который внутри объекта вызывается статус c.

Ответы [ 3 ]

1 голос
/ 26 марта 2020

ты прав. Если вы используете метод stati c, у вас будут проблемы с тестами и внедрением зависимостей, и это так.

Вам следует преобразовать ErrorLog в Singleton, а затем проверить его с помощью шпиона. Например:

public class ErrorLog {         
    private static ErrorLog = new ErrorLog();

    public static ErrorLog getInstance() {
        return errorLog;
    }

    public void increment(String exception) {
    // do something
    }
}

import ErrorLog;
public class Calculator {
    public int division(int a, int b) {
        if (b == 0) {
            ErrorLog.getInstance()increment("Divide by Zero");
        } else {
            return a / b;
        }
    }
}

И с этого момента вы можете использовать следующий фрагмент кода для проверки вызовов:

ErrorLog errorLog = ErrorLog.getInstance();
ErrorLog errorLogSpy = spy(errorLog);

verify(errorLogSpy , times(1)).increment(any());
1 голос
/ 26 марта 2020

Вы правы verifyStatic не имеет никаких способов проверить вызываемый метод.

Но есть обходной путь. Посмотрите, сработает ли это для вас.

Способ макетирования метода c заключается в использовании

PowerMockito.mockStatic(ErrorLog.class)

Но вы также можете использовать другой вариант

PowerMockito.mockStatic(ErrorLog.class, invocationOnMock -> {
        assertEquals("something", invocationOnMock.getArgumentAt(0, String.class));
        return null;
    });
ErrorLog.increment("something");

Если вы не имитируете класс ErrorLog, вы не можете проверить

0 голосов
/ 26 марта 2020

Спасибо за ответы, это направило меня в правильном направлении. Вот что помогло мне (я использую среду TestNG).

package com.apple.sample.powermock;

import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.testng.PowerMockTestCase;
import org.testng.annotations.Test;
import static org.testng.Assert.assertEquals;

@PrepareForTest({ErrorLog.class})
public class TestStaticMethods extends PowerMockTestCase {
    @Test
    public void testSpy() throws Exception {

        PowerMockito.mockStatic(ErrorLog.class, invocation -> {
            assertEquals("Division by Zero", invocation.getArgument(0, String.class));
                return null;
                });

        new Math().division(10, 0);
    }
}
...