ClassNotFoundException при запуске теста JUnit в Maven - PullRequest
0 голосов
/ 14 февраля 2020

В настоящее время я пытаюсь настроить автоматическое тестирование для проекта Maven, но столкнулся с проблемой. При выполнении моих тестов с использованием mvn test, я получаю следующий результат:

-------------------------------------------------------------------------------
Test set: no.digipat.patornat.servlets.ServletTests
-------------------------------------------------------------------------------
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.398 s <<< FAILURE! - in no.digipat.patornat.servlets.ServletTests
no.digipat.patornat.servlets.ServletTests  Time elapsed: 0.368 s  <<< ERROR!
java.lang.NoClassDefFoundError: com/mongodb/OperationExecutor
Caused by: java.lang.ClassNotFoundException: com.mongodb.OperationExecutor


Я получаю ту же ошибку при запуске тестов в Eclipse.

Это мой pom. xml :

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>no.digipat.patornat</groupId>
  <artifactId>backend</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>Pat or Nat Backend</name>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.target>11</maven.compiler.target>
    <maven.compiler.source>11</maven.compiler.source>
  </properties>

  <repositories>
    <repository>
      <id>cytomine-uliege-Cytomine-java-client</id>
      <url>https://packagecloud.io/cytomine-uliege/Cytomine-java-client/maven2</url>
      <releases>
        <enabled>true</enabled>
      </releases>
      <snapshots>
        <enabled>true</enabled>
      </snapshots>
    </repository>
  </repositories>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.13</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>com.lordofthejars</groupId>
      <artifactId>nosqlunit-mongodb</artifactId>
      <version>1.0.0</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>com.github.fakemongo</groupId>
      <artifactId>fongo</artifactId>
      <version>2.2.0-RC2</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>com.github.stefanbirkner</groupId>
      <artifactId>system-rules</artifactId>
      <version>1.19.0</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.0.1</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>be.cytomine.client</groupId>
      <artifactId>cytomine-java-client</artifactId>
      <version>2.0.7-SNAPSHOT</version>
    </dependency>
    <dependency>
      <groupId>org.mongodb</groupId>
      <artifactId>mongo-java-driver</artifactId>
      <version>3.12.1</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>3.0.0-M4</version>
        <configuration>
          <includes>
            <include>ServletTests.java</include>
          </includes>
        </configuration>
      </plugin>
    </plugins>
  </build>

</project>

Соответствующие Java файлы:

ServletTests. java:

package no.digipat.patornat.servlets;
import org.junit.BeforeClass;
import org.junit.ClassRule;
import org.junit.contrib.java.lang.system.EnvironmentVariables;
import org.junit.rules.RuleChain;
import org.junit.rules.TestRule;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;

import static com.lordofthejars.nosqlunit.mongodb.InMemoryMongoDb.InMemoryMongoRuleBuilder.newInMemoryMongoDbRule;

@RunWith(Suite.class)
@SuiteClasses({MyTest.class})
public class ServletTests {

    private static final EnvironmentVariables environmentVariables = new EnvironmentVariables();
    @ClassRule
    public static final TestRule chain = RuleChain
        .outerRule(newInMemoryMongoDbRule().build())
        .around(environmentVariables);

    @BeforeClass
    public static void setUpClass() {
        environmentVariables.set("MY_VARIABLE", "some value");
    }

}

MyTest. java:

package no.digipat.patornat.servlets;
import static org.junit.Assert.*;

import org.junit.Test;

public class MyTest {

    @Test
    public void test() {
        fail("Not yet implemented");
    }

}

Есть идеи, как это решить? Я попытался запустить mvn clean (который ранее помог мне решить аналогичную проблему), но безрезультатно.

Ответы [ 2 ]

0 голосов
/ 14 февраля 2020

Похоже, проблема заключалась в том, что последние версии драйверов Fon go и mon go - java несовместимы. Когда я меняю зависимости драйвера Fon go и / или драйвера Mon go Java на более старые версии (я специально пробовал версии 2.1.0 и 3.6.3 соответственно), ошибка исчезает. Тем не менее, поскольку это решение кажется довольно простым и негибким, лучше всего перейти на альтернативу Fon go. Согласно этот комментарий GitHub , mon go - java -server может быть хорошим вариантом. Возможно, более надежная альтернатива, которую я, вероятно, в конечном итоге буду использовать, - это использование «настоящей» тестовой базы данных. Эта статья содержит информацию о нескольких способах сделать это.

0 голосов
/ 14 февраля 2020

Я думаю, вам нужно maven-compiler-plugin в вашем pom.xml

<build>
  <!-- put here the path of your test source directory -->
  <testSourceDirectory>src/test</testSourceDirectory>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <configuration>
        <source>${maven.compiler.source}</source>
        <target>${maven.compiler.target}</target>
      </configuration>
    </plugin>
  </plugins>
  ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...