NetBeans хорош, потому что можно использовать его в Windows и Mac OS X.
Для начала, ссылка на старую статью в моем блоге о том, как предикат NOT IN
работает в SQL Server
(и в других системах тоже):
Вы можете переписать его следующим образом:
SELECT *
FROM Orders o
WHERE NOT EXISTS
(
SELECT NULL
FROM HeldOrders ho
WHERE ho.OrderID = o.OrderID
)
, однако большинство баз данных будут обрабатывать эти запросы одинаково.
PowerMock имеет эту способность. Он также может имитировать экземпляры объектов внутри тестируемого класса. Если ваш протестированный метод вызывает new Foo (), вы можете создать фиктивный объект для этого Foo и заменить его в методе, который вы тестируете.
Также возможны такие вещи, как подавление конструкторов и статических инициализаторов. Все это считается непроверяемым кодом и поэтому не рекомендуется делать, но если у вас есть устаревший код, его изменение не всегда возможно. Если вы находитесь в таком положении, вам может помочь PowerMock .
Как указано в другом ответе выше, 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+.
Вы имеете в виду, что не можете управлять кодом вызова? Потому что, если вы управляете вызовами в статического метода, но не самой реализацией, вы можете легко сделать это тестируемым. Создайте интерфейс зависимости с помощью одного метода с той же сигнатурой, что и статический метод. Ваша производственная реализация просто вызовет статический метод, но все, что в настоящее время вызывает статический метод, будет вместо этого вызывать через интерфейс.
Затем вы можете смоделировать этот интерфейс обычным способом.
Фреймворк JMockit обещает разрешить имитацию статических методов.
Фактически, он делает несколько довольно смелых заявлений, в том числе о том, что статические методы являются совершенно правильным выбором дизайна и их использование не должно ограничиваться из-за неадекватности фреймворки тестирования.
Независимо от того, оправданы ли такие утверждения, сам фреймворк JMockit довольно интересен, хотя я еще не пробовал его сам.
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;}
}
Это одна из причин, по которой статические методы плохи.
Мы переделали большую часть наших фабрик, добавив в них сеттеры, чтобы мы могли устанавливать в них фиктивные объекты. Фактически, мы придумали что-то близкое к внедрению зависимостей, когда один метод действует как фабрика для всех наших синглтонов.
В вашем случае добавление метода Logger.setLogger () (и сохранение этого значения) может сработать. Если вам нужно, вы можете расширить класс регистратора и затенять метод getLogger своим собственным.
Вы можете использовать AspectJ, чтобы перехватить вызов статического метода и сделать что-нибудь полезное для вашего теста.