2015-11-10 3 views
0

Я пытаюсь проверить server plugin в рамках единичного теста. Я изо всех сил старался настроить модульные тесты так же, как this project.SDN4 - Интеграционное тестирование серверных плагинов neo4j

Проблема, которую я испытываю с моим кодом, связана с InProcessServer, созданным классом PersistenceContext. InProcessServer начинается с первого порта, доступного с 7474, и поэтому для моих тестов создается несколько InProcessServers, я думаю, потому что новые тесты выполняются до того, как порт из предыдущего теста закрыт?

Другими словами, во время выполнения теста, я найду в серверы процесса открыть в браузере на локальном хосте: 7474, локальный: 7475, локальный, 7476 и так далее ...

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

Мои вопросы:

1) ли я понял, все это право в первую очередь?

2) Как проверить серверный плагин как часть более крупного интеграционного теста, если я не могу заранее указать порт вместе с плагином сервера uri? Есть ли чистый способ узнать порт сервера, который в настоящее время используется для тестирования во время выполнения?

+0

У меня такая же проблема, как и у вас, когда мне нужно настроить порт во время компиляции. Вы когда-нибудь это решали? – Selwyn

+0

Привет, Селвин - да, я давно это сделал, но решение теперь старое с выпуском 4.1. Если вы все еще интересуетесь тем, как я делал то, что я могу опубликовать, если вас все еще интересует. Я только что видел ваш комментарий. –

+0

вы можете удержать его. Я думаю, что InProcessServer теперь устарел? Я переключился на «org.neo4j.ogm.drivers.embedded.driver.EmbeddedDriver», который, как мне кажется, устраняет необходимость настройки порта во время компиляции. – Selwyn

ответ

0

InProcessServer не предоставляет отдельный номер порта, но он раскрывает полный URL-адрес, который включает номер порта. Это всегда имеет форму «http://localhost:xxxx». Вы можете извлечь номер порта из этого достаточно легко, если по какой-то причине вам понадобится его отдельно.

+0

Что делать, если нам нужно знать порт # во время компиляции? – Selwyn

+1

SDN 4.1 (в скором времени) позволит вам настроить TestServer так, как вам хотелось бы. В то же время, вы можете бросить свой собственный - это очень простой класс. Я отправил код в отдельный ответ, который вы могли бы использовать вместо существующего InProcessServer. – Vince

0

Этот совет может быть полезен при тестировании с помощью расширений сервера:

https://jira.spring.io/browse/DATAGRAPH-656?focusedCommentId=117218&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-117218

Копирование, что он предлагает здесь:

Чтобы проверить Neo4jExtension, вам нужно создать свой собственный TestServer и InProcessServer так что вы можете подключить расширение. Что-то вроде этого: общественного Neo4jTestServer() {

try { 
     ServerControls controls = TestServerBuilders.newInProcessBuilder() 
       .withExtension("/mypath", "org.mypackage") 
       .withConfig("dbms.security.auth_enabled", "false") 
       .newServer(); 

     initialise(controls); //Or try extracting the uri, port from controls this point 

    } catch (Exception e) { 
     throw new RuntimeException("Error starting in-process server",e); 
    } 

} 
+0

Можно ли настроить порт во время компиляции? Я делаю интеграционный тест в spring-data-neo4j, а моя конфигурация подключения neo4j поступает из файла neo4j.properties. – Selwyn

0

Если вы хотите иметь полный контроль над настройке InProcessServer, его не трудно свернуть свой собственный. Это сделает работу:

public class MyInProcessServer implements Neo4jServer { 

    private TestServer testServer; 

    public InProcessServer(TestServer testServer) { 
    this.testServer = testServer; 
    } 

    public String url() { 
    return this.testServer.url(); 
    } 

    @Override 
    public String username() { 
    return "neo4j"; 
    } 

    @Override 
    public String password() { 
    return "password"; 
    } 

    public GraphDatabaseService database() { 
    return testServer.getGraphDatabaseService(); 
    } 
} 

Вы, очевидно, нужно настроить Spring конфигурации соответственно:

@Bean 
@Override 
public Neo4jServer neo4jServer() { 
    return new MyInProcessServer(new TestServer(6666)); 
} 

Не тестировался, но он должен работать.

Смежные вопросы