Соединение MySQL, с где пункт

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

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

  1. Использование Hypersonic or H2 в режиме в оперативной памяти как замена для базы данных (это работает лучше всего на ORMs)
  2. Инициализируют базу данных в @BeforeSuite или эквивалентный (снова: самый легкий с ORMs)
  3. Причал Использования для запуска незавершенного веб-сервера.
  4. @Before каждый тест, очистите базу данных и инициализируйте с необходимыми данными
  5. Использование 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.

121
задан bluish 9 July 2012 в 12:53
поделиться

1 ответ

Вам нужно поместить его в предложение 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 . У вас остался неэффективный способ получить внутреннее соединение .

Надеюсь, это поможет!

267
ответ дан 24 November 2019 в 01:30
поделиться
Другие вопросы по тегам:

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