Как я могу легко дразнить статический метод в Java (jUnit4)

NetBeans хорош, потому что можно использовать его в Windows и Mac OS X.

15
задан Colin Harrington 29 July 2009 в 21:02
поделиться

8 ответов

Для начала, ссылка на старую статью в моем блоге о том, как предикат NOT IN работает в SQL Server (и в других системах тоже):


Вы можете переписать его следующим образом:

SELECT  *
FROM    Orders o
WHERE   NOT EXISTS
        (
        SELECT  NULL
        FROM    HeldOrders ho
        WHERE   ho.OrderID = o.OrderID
        )

, однако большинство баз данных будут обрабатывать эти запросы одинаково.

0
ответ дан 1 December 2019 в 03:05
поделиться

PowerMock имеет эту способность. Он также может имитировать экземпляры объектов внутри тестируемого класса. Если ваш протестированный метод вызывает new Foo (), вы можете создать фиктивный объект для этого Foo и заменить его в методе, который вы тестируете.

Также возможны такие вещи, как подавление конструкторов и статических инициализаторов. Все это считается непроверяемым кодом и поэтому не рекомендуется делать, но если у вас есть устаревший код, его изменение не всегда возможно. Если вы находитесь в таком положении, вам может помочь PowerMock .

4
ответ дан 1 December 2019 в 03:05
поделиться

Как указано в другом ответе выше, JMockit может имитировать статические методы (а также все остальное).

Он даже имеет прямую поддержку фреймворков ведения журналов. Например, можно написать:


@UsingMocksAndStubs(Log4jMocks.class)
public class SomeServiceTest
{
    // All test methods in this class will have any calls
    // to the Log4J API automatically stubbed out.
}

Однако поддержка JUnit 4.4 была прекращена. Поддерживаются JUnit 3.8, JUnit 4.5+ и TestNG 5.8+.

1
ответ дан 1 December 2019 в 03:05
поделиться

Вы имеете в виду, что не можете управлять кодом вызова? Потому что, если вы управляете вызовами в статического метода, но не самой реализацией, вы можете легко сделать это тестируемым. Создайте интерфейс зависимости с помощью одного метода с той же сигнатурой, что и статический метод. Ваша производственная реализация просто вызовет статический метод, но все, что в настоящее время вызывает статический метод, будет вместо этого вызывать через интерфейс.

Затем вы можете смоделировать этот интерфейс обычным способом.

14
ответ дан 1 December 2019 в 03:05
поделиться

Фреймворк JMockit обещает разрешить имитацию статических методов.

https://jmockit.dev.java.net/

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

Независимо от того, оправданы ли такие утверждения, сам фреймворк JMockit довольно интересен, хотя я еще не пробовал его сам.

4
ответ дан 1 December 2019 в 03:05
поделиться
public interface LoggerWrapper {
    public Logger getLogger(Class<?> c);
    }
public class RealLoggerWrapper implements LoggerWrapper {
    public Logger getLogger(Class<?> c) {return Logger.getLogger(c);}
    }
public class MockLoggerWrapper implements LoggerWrapper {
    public Logger getLogger(Class<?> c) {return somethingElse;}
    }
1
ответ дан 1 December 2019 в 03:05
поделиться

Это одна из причин, по которой статические методы плохи.

Мы переделали большую часть наших фабрик, добавив в них сеттеры, чтобы мы могли устанавливать в них фиктивные объекты. Фактически, мы придумали что-то близкое к внедрению зависимостей, когда один метод действует как фабрика для всех наших синглтонов.

В вашем случае добавление метода Logger.setLogger () (и сохранение этого значения) может сработать. Если вам нужно, вы можете расширить класс регистратора и затенять метод getLogger своим собственным.

0
ответ дан 1 December 2019 в 03:05
поделиться

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

0
ответ дан 1 December 2019 в 03:05
поделиться
Другие вопросы по тегам:

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