2016-09-07 4 views
1

У меня есть проект бэкэнда java, который включает службы для импорта данных из базы данных. Во время работы над новыми функциями мне иногда нужно развернуть и запустить код на моей локальной машине. Поскольку на самом деле я не хочу подключаться к производственной базе данных при запуске экспериментального кода, я настроил макет класса данных с использованием Mockito.Исключая Mock Datasource In Maven Профиль

Mock datasource отлично работает и делает то, что я хочу, работая локально. Проблема, с которой я сталкиваюсь, заключается в том, что я не хочу включать этот класс и связанные с ним зависимости при выполнении производственного развертывания. Я добавил раздел <excludes> в раздел конфигурации maven-compiler-plugin. Я добавил конкретные зависимости Mock к разделу «локальный» профиль. Однако, когда я пытаюсь выполнить компиляцию с использованием maven, я получаю ошибки компиляции в классе mock datasource, который должен был быть исключен. Я опубликую соответствующие фрагменты из моего .pom-файла ниже. Я попытался помещать оператор исключений в определенный профиль и в «default», как показано ниже. Любая помощь с этим была бы весьма признательна.

<profiles> 
    <profile> 
     <id>local</id> 
     <properties> 
     <config>config.dev.properties</config> 
     </properties> 

     <dependencies>   
      <dependency> 
       <groupId>org.mockito</groupId> 
       <artifactId>mockito-core</artifactId> 
       <version>1.9.5</version>    
      </dependency> 
     </dependencies> 
    </profile> 
    ... 
</profiles> 


<build> 
    <finalName>order</finalName> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>3.1</version> 

      <configuration> 

       <excludes> 
         <exclude>com/tura/order/guice/mock/**</exclude> 
       </excludes> 
       <compilerId>groovy-eclipse-compiler</compilerId> 
      </configuration> 
     </plugin> 

    </plugins> 
</build> 

ответ

2

Как простой альтернатива, можно настроить альтернативную версию приложения для запуска из SRC/главного каталога/источника теста, вместо обычного каталога. Вы также удалили бы профиль и только объявили бы зависимость mockito с тестом области (добавив тест). Таким образом, вы можете запустить приложение на своем компьютере, но этот код и mockito не будут отображаться в окончательной сборке.

Я думаю, что было бы намного проще, если вы можете легко настроить приложение для запуска из теста, но я не понимаю, почему это было бы иначе. Обычно избегать использования профилей Maven считается хорошей практикой, если есть альтернативные способы.

EDIT: после вашего вопроса ...

Итак, сначала убедитесь, что Mockito определяется с «тест» в рамках вы POM. Как это:

<dependency> 
    <groupId>org.mockito</groupId> 
    <artifactId>mockito-core</artifactId> 
    <version>1.10.19</version> 
    <scope>test</scope> 
</dependency> 

Тогда ваш код не должен составить больше, поскольку он находится в SRC/основной/Java и нуждается в Mockito.

Передайте свой код в src/test/java/где он сможет извлечь выгоду из тестовых зависимостей (таким образом, Mockito). Вы должны знать, что тестовые зависимости и код тестирования (в src/test /) не будут частью финальной банки. Так вот что вы хотите.

И я забыл сказать, что код в src/test/может быть любым, что вам нравится: модульные тестовые тесты, приложения с основными (..) методами.

Единственная сложная часть может заключаться в том, чтобы заставить ваш код работать с тестами. Но тестовый код «видит» основной код (противоположное не соответствует действительности), поэтому вам придется вызывать основной код и передавать его ваш макет, где ваш макет создается в тестовом коде.

Надеется, что это помогает

+0

Я не уверен, что решение будет работать для этого проекта, но я могу дать ему шанс, если я не смогу найти лучший способ. Не могли бы вы указать мне на учебник или пример где-нибудь, где объясняется, как настроить проект, как вы описали? – pbuchheit

0

Altough Мне нравится ответ Франсуа Маро, это другой выбор чище (жесткий сложнее): Разделить текущий проект на несколько из них:

  • Один проекта, содержащий ядра код приложения: он должен публиковать чистые API без зависимостей.
  • Другой проект, который должен иметь зависимость от ядра, и включать в себя подструктуру mockito, а также ваш «локальный» внешний вид окружающей среды.
  • Последний, если необходимо, должен иметь зависимость от ядра и добавлять надлежащую инфраструктуру и классы для «производственной» среды (в зависимости от сложности, возможно, вы могли бы включить ее в самое ядро) ,

Таким образом вы упакуете свой код в 100% -ные библиотеки повторного использования и создадите один дистрибутив для каждой требуемой целевой среды, чтобы ни один из них не был загрязнен кодом, предназначенным для других целевых сред.

И POM станут проще и не нуждаются в профилях.