Имитация статического метода того же класса, который необходимо протестировать в модульном тесте

У меня есть класс с несколькими статическими методами. Один статический метод вызывает еще один частный метод, который в конечном итоге вызывает второй общедоступный статический метод. Я хочу поиздеваться над вторым статическим методом. Это возможно. например

public static A(){
    b();
} 
private static b(){
    c();
}
public static c(){
}

Я хочу издеваться над c (), но хочу сохранить функциональность a () и b () как есть. Это возможно? Если да, то как?

И для записи: не забывайте принимать полезный ответ в какой-то момент, новички слишком часто ... забудьте об этой части ;-)

GhostCat 31.10.2018 13:47
1
1
986
2

Ответы 2

Этот существующий SO вопрос рассказывает вам, как это сделать, используя PowerMockito, и статический mocking, и концепцию шпион Mockito.

Но чего не хватает в этом вводе: хотя эти решения технический работают, вам следует подумать о том, чтобы нет пошел по этому пути.

Вместо этого: вы создали дизайн трудно проверить. Теперь вы смотрите на (черную) издевательскую магию для тестирования. Настоящий ответ: сделайте шаг назад и оцените свой дизайн. Попробуйте переделать его, чтобы он стал легкий для тестирования.

Все остальное в конечном итоге - пустая трата времени и энергии. Потому что сложно тестируемые проекты также трудно тестировать в «реальных» сценариях, и они чаще всего негибкие и их сложно поддерживать / улучшать с течением времени.

Я ценю, когда ответы перенаправляют на правильный чистый путь, а не просто указывают на решение, которое может решить проблему, но на самом деле не должно использоваться, потому что оно поощряет плохой дизайн.

Nkosi 31.10.2018 13:24

@Nkosi Пожалуйста. Буквально на прошлой неделе мы столкнулись со старым модульным тестом PowerMock, который другая команда написала несколько лет назад. Мы не меняли относящийся к нему что-нибудь, но внезапно этот тест оказался для нас неуспешным, что помешало прохождению наших сборок. На самом деле стоит держаться подальше от PowerMock (ito), если у вас нет абсолютно другой альтернативы ...

GhostCat 31.10.2018 13:47

Как упоминал @GhostCat: необходимость имитировать статические методы - это плохой дизайн, поэтому вам следует прежде всего подумать о рефакторинге своего кода, чтобы вам не понадобились статические насмешки.

Mockito не поддерживает имитацию статических методов. Подробнее здесь

Вместо этого вы можете использовать PowerMockito.

Например:

PowerMockito.stub(PowerMockito.method(YourStaticClass.class, "c")).toReturn("someValue"); 

Кстати: похоже, у ваших методов нет возвращаемого типа.

Другие вопросы по теме