Я использовал JUnit для того, чтобы сделать большое интеграционное тестирование. Интеграционное тестирование может, конечно, означать много разных вещей. Для большего количества системных интеграционных тестов уровня я предпочитаю позволять сценариям управлять моим процессом тестирования снаружи.
Вот подход, который работает хорошо на меня для приложений, которые используют http и базы данных, и я хочу проверить целый стек:
Hypersonic or H2
в режиме в оперативной памяти как замена для базы данных (это работает лучше всего на ORMs) @BeforeSuite
или эквивалентный (снова: самый легкий с ORMs) @Before
каждый тест, очистите базу данных и инициализируйте с необходимыми данными JWebUnit
для выполнения Запросов HTTP к Причалу , Это дает Вам интеграционные тесты, которые могут работать без любой установки сервера базы данных или сервера приложений, и это осуществляет стек от http вниз. Так как это не имеет никаких зависимостей от внешних ресурсов, это тестовые прогоны, прекрасные на сервере сборки.
Здесь часть кода я использую:
@BeforeClass
public static void startServer() throws Exception {
System.setProperty("hibernate.hbm2ddl.auto", "create");
System.setProperty("hibernate.dialect", "...");
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setJdbcUrl("jdbc:hsqldb:mem:mytest");
new org.mortbay.jetty.plus.naming.Resource(
"jdbc/primaryDs", dataSource);
Server server = new Server(0);
WebAppContext webAppContext = new WebAppContext("src/main/webapp", "/");
server.addHandler(webAppContext);
server.start();
webServerPort = server.getConnectors()[0].getLocalPort();
}
// From JWebUnit
private WebTestCase tester = new WebTestCase();
@Before
public void createTestContext() {
tester.getTestContext().setBaseUrl("http://localhost:" + webServerPort + "/");
dao.deleteAll(dao.find(Product.class));
dao.flushChanges();
}
@Test
public void createNewProduct() throws Exception {
String productName = uniqueName("product");
int price = 54222;
tester.beginAt("/products/new.html");
tester.setTextField("productName", productName);
tester.setTextField("price", Integer.toString(price));
tester.submit("Create");
Collection products = dao.find(Product.class);
assertEquals(1, products.size());
Product product = products.iterator().next();
assertEquals(productName, product.getProductName());
assertEquals(price, product.getPrice());
}
Для тех, кто хотел бы знать больше, я записал статья о Встроенных Интеграционных тестах с Причалом и JWebUnit на Java.net.
Вам нужно поместить его в предложение join
, а не в , где
:
SELECT *
FROM categories
LEFT JOIN user_category_subscriptions ON
user_category_subscriptions.category_id = categories.category_id
and user_category_subscriptions.user_id =1
См., С внутренним соединением
], поместив предложение в join
или , где
эквивалентно. Однако с внешним соединением
они сильно отличаются.
В качестве условия join
вы указываете набор строк, который вы будете присоединять к таблице. Это означает, что сначала он оценивает user_id = 1
и берет подмножество user_category_subscriptions
с user_id
из 1
, чтобы присоединиться ко всем из строки в категориях
. Это даст вам все строки в категориях
, в то время как только категории
, на которые этот конкретный пользователь подписался, будут иметь какую-либо информацию в столбцах user_category_subscriptions
. Конечно, все остальные категории
будут заполнены нулевым
в столбцах user_category_subscriptions
.
И наоборот, , где предложение
выполняет join, и , затем сокращает набор строк. Таким образом, выполняется все соединения, а затем удаляются все строки, в которых user_id
не равно 1
. У вас остался неэффективный способ получить внутреннее соединение
.
Надеюсь, это поможет!
все остальные категории
будут заполнены null
в столбцах user_category_subscriptions
.
И наоборот, , где предложение
выполняет соединение, и , затем сокращает набор строк. Таким образом, выполняется все соединения, а затем удаляются все строки, в которых user_id
не равно 1
. У вас остался неэффективный способ получить внутреннее соединение
.
Надеюсь, это поможет!
все остальные категории
будут заполнены null
в столбцах user_category_subscriptions
.
И наоборот, , где предложение
выполняет соединение, и , затем сокращает набор строк. Таким образом, выполняется все соединения, а затем удаляются все строки, в которых user_id
не равно 1
. У вас остался неэффективный способ получить внутреннее соединение
.
Надеюсь, это поможет!