Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 测试SpringBoot JPA时出现不兼容的ClassChangeError_Java_Hibernate_Spring Boot_Testing_Spring Data Jpa - Fatal编程技术网

Java 测试SpringBoot JPA时出现不兼容的ClassChangeError

Java 测试SpringBoot JPA时出现不兼容的ClassChangeError,java,hibernate,spring-boot,testing,spring-data-jpa,Java,Hibernate,Spring Boot,Testing,Spring Data Jpa,我正在尝试为测试SpringJPA接口进行集成测试 我得到了错误java.lang.CompatibileClassChangeError:找到了接口org.springframework.test.context.TestContext,但类是预期的,我不确定为什么会出现这种情况。我实际上是在跟随 StackTrace java.lang.IncompatibleClassChangeError: Found interface org.springframework.test.context

我正在尝试为测试SpringJPA接口进行集成测试

我得到了错误
java.lang.CompatibileClassChangeError:找到了接口org.springframework.test.context.TestContext,但类是预期的
,我不确定为什么会出现这种情况。我实际上是在跟随

StackTrace

java.lang.IncompatibleClassChangeError: Found interface org.springframework.test.context.TestContext, but class was expected
at com.github.springtestdbunit.DbUnitTestExecutionListener.prepareTestInstance(DbUnitTestExecutionListener.java:84)
at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:228)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:230)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:289)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:291)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:249)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:89)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:193)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Application.java

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
@Entity
@Table(name = "users")
public class User {

  // ------------------------
  // PRIVATE FIELDS
  // ------------------------

  // An autogenerated id (unique for each user in the db)
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private long id;

  // The user's email
  @NotNull
  private String email;

  // The user's name
  @NotNull
  private String name;

  // ------------------------
  // PUBLIC METHODS
  // ------------------------

  public User() { }

  public User(long id) { 
    this.id = id;
  }

  public User(String email, String name) {
    this.email = email;
    this.name = name;
  }

  // Getter and setter methods

  public long getId() {
    return id;
  }

  public void setId(long value) {
    this.id = value;
  }

  public String getEmail() {
    return email;
  }

  public void setEmail(String value) {
    this.email = value;
  }

  public String getName() {
    return name;
  }

  public void setName(String value) {
    this.name = value;
  }

} // class User
import javax.transaction.Transactional;

import org.springframework.data.repository.CrudRepository;

@Transactional
public interface UserRepository extends CrudRepository<User, Long> {

}
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    UserRepository ur;

    @RequestMapping(value = "{id}", method = RequestMethod.GET)
    @ResponseBody
    public String getName(@PathVariable("id") Long id) {
        User a = ur.findOne(id);
        return a.getName();
    }

    @RequestMapping(value = "{name}", method = RequestMethod.POST)
    @ResponseBody
    public String setUser(@PathVariable("name") String name) {
        User usr = new User("email@email.com", name);
        ur.save(usr);
        return name + "Created";
    }
}
import javax.persistence.PersistenceContext;

import org.hamcrest.collection.IsIterableWithSize;
import static org.hamcrest.MatcherAssert.assertThat;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.TestExecutionListeners;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.DependencyInjectionTestExecutionListener;
import org.springframework.test.context.transaction.TransactionalTestExecutionListener;

import com.github.springtestdbunit.DbUnitTestExecutionListener;
import com.github.springtestdbunit.annotation.DatabaseSetup;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {PersistenceContext.class})
@TestExecutionListeners({DependencyInjectionTestExecutionListener.class,
        TransactionalTestExecutionListener.class,
        DbUnitTestExecutionListener.class})
@DatabaseSetup("users-entries.xml")
public class UserTest {

    @Autowired
    private UserRepository userRepo;

    @Test
    public void findbyName_usingName() {
        Iterable<User> searchResults = userRepo.findAll();
        assertThat(searchResults, IsIterableWithSize.<User>iterableWithSize(2));    }
}
User.java

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
@Entity
@Table(name = "users")
public class User {

  // ------------------------
  // PRIVATE FIELDS
  // ------------------------

  // An autogenerated id (unique for each user in the db)
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private long id;

  // The user's email
  @NotNull
  private String email;

  // The user's name
  @NotNull
  private String name;

  // ------------------------
  // PUBLIC METHODS
  // ------------------------

  public User() { }

  public User(long id) { 
    this.id = id;
  }

  public User(String email, String name) {
    this.email = email;
    this.name = name;
  }

  // Getter and setter methods

  public long getId() {
    return id;
  }

  public void setId(long value) {
    this.id = value;
  }

  public String getEmail() {
    return email;
  }

  public void setEmail(String value) {
    this.email = value;
  }

  public String getName() {
    return name;
  }

  public void setName(String value) {
    this.name = value;
  }

} // class User
import javax.transaction.Transactional;

import org.springframework.data.repository.CrudRepository;

@Transactional
public interface UserRepository extends CrudRepository<User, Long> {

}
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    UserRepository ur;

    @RequestMapping(value = "{id}", method = RequestMethod.GET)
    @ResponseBody
    public String getName(@PathVariable("id") Long id) {
        User a = ur.findOne(id);
        return a.getName();
    }

    @RequestMapping(value = "{name}", method = RequestMethod.POST)
    @ResponseBody
    public String setUser(@PathVariable("name") String name) {
        User usr = new User("email@email.com", name);
        ur.save(usr);
        return name + "Created";
    }
}
import javax.persistence.PersistenceContext;

import org.hamcrest.collection.IsIterableWithSize;
import static org.hamcrest.MatcherAssert.assertThat;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.TestExecutionListeners;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.DependencyInjectionTestExecutionListener;
import org.springframework.test.context.transaction.TransactionalTestExecutionListener;

import com.github.springtestdbunit.DbUnitTestExecutionListener;
import com.github.springtestdbunit.annotation.DatabaseSetup;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {PersistenceContext.class})
@TestExecutionListeners({DependencyInjectionTestExecutionListener.class,
        TransactionalTestExecutionListener.class,
        DbUnitTestExecutionListener.class})
@DatabaseSetup("users-entries.xml")
public class UserTest {

    @Autowired
    private UserRepository userRepo;

    @Test
    public void findbyName_usingName() {
        Iterable<User> searchResults = userRepo.findAll();
        assertThat(searchResults, IsIterableWithSize.<User>iterableWithSize(2));    }
}
UserRepository.java

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
@Entity
@Table(name = "users")
public class User {

  // ------------------------
  // PRIVATE FIELDS
  // ------------------------

  // An autogenerated id (unique for each user in the db)
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private long id;

  // The user's email
  @NotNull
  private String email;

  // The user's name
  @NotNull
  private String name;

  // ------------------------
  // PUBLIC METHODS
  // ------------------------

  public User() { }

  public User(long id) { 
    this.id = id;
  }

  public User(String email, String name) {
    this.email = email;
    this.name = name;
  }

  // Getter and setter methods

  public long getId() {
    return id;
  }

  public void setId(long value) {
    this.id = value;
  }

  public String getEmail() {
    return email;
  }

  public void setEmail(String value) {
    this.email = value;
  }

  public String getName() {
    return name;
  }

  public void setName(String value) {
    this.name = value;
  }

} // class User
import javax.transaction.Transactional;

import org.springframework.data.repository.CrudRepository;

@Transactional
public interface UserRepository extends CrudRepository<User, Long> {

}
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    UserRepository ur;

    @RequestMapping(value = "{id}", method = RequestMethod.GET)
    @ResponseBody
    public String getName(@PathVariable("id") Long id) {
        User a = ur.findOne(id);
        return a.getName();
    }

    @RequestMapping(value = "{name}", method = RequestMethod.POST)
    @ResponseBody
    public String setUser(@PathVariable("name") String name) {
        User usr = new User("email@email.com", name);
        ur.save(usr);
        return name + "Created";
    }
}
import javax.persistence.PersistenceContext;

import org.hamcrest.collection.IsIterableWithSize;
import static org.hamcrest.MatcherAssert.assertThat;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.TestExecutionListeners;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.DependencyInjectionTestExecutionListener;
import org.springframework.test.context.transaction.TransactionalTestExecutionListener;

import com.github.springtestdbunit.DbUnitTestExecutionListener;
import com.github.springtestdbunit.annotation.DatabaseSetup;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {PersistenceContext.class})
@TestExecutionListeners({DependencyInjectionTestExecutionListener.class,
        TransactionalTestExecutionListener.class,
        DbUnitTestExecutionListener.class})
@DatabaseSetup("users-entries.xml")
public class UserTest {

    @Autowired
    private UserRepository userRepo;

    @Test
    public void findbyName_usingName() {
        Iterable<User> searchResults = userRepo.findAll();
        assertThat(searchResults, IsIterableWithSize.<User>iterableWithSize(2));    }
}
用户条目.xml

<dataset>
    <users id="#{new Long(1)}"
           email="jon@email.com"
           name="Jon"/>
    <users id="#{new Long(2)}"
           email="mike@email.com"
           name="Mike"/>
</dataset>
<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.elderstudios</groupId>
    <artifactId>watchmaker</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>qqq</name>
    <description>Timesheet System</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.3.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.assertj</groupId>
            <artifactId>assertj-core</artifactId>
            <version>3.2.0</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
          <groupId>com.github.springtestdbunit</groupId>
          <artifactId>spring-test-dbunit</artifactId>
          <version>1.0.0</version>
          <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.dbunit</groupId>
            <artifactId>dbunit</artifactId>
            <version>2.5.1</version>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <artifactId>junit</artifactId>
                    <groupId>junit</groupId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>
POM.xml

<dataset>
    <users id="#{new Long(1)}"
           email="jon@email.com"
           name="Jon"/>
    <users id="#{new Long(2)}"
           email="mike@email.com"
           name="Mike"/>
</dataset>
<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.elderstudios</groupId>
    <artifactId>watchmaker</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>qqq</name>
    <description>Timesheet System</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.3.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.assertj</groupId>
            <artifactId>assertj-core</artifactId>
            <version>3.2.0</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
          <groupId>com.github.springtestdbunit</groupId>
          <artifactId>spring-test-dbunit</artifactId>
          <version>1.0.0</version>
          <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.dbunit</groupId>
            <artifactId>dbunit</artifactId>
            <version>2.5.1</version>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <artifactId>junit</artifactId>
                    <groupId>junit</groupId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

4.0.0
com.elderstudios
钟表匠
0.0.1-快照
罐子
qqq
时间表系统
org.springframework.boot
spring启动程序父级
1.3.2.1发布
UTF-8
1.8
org.springframework.boot
SpringBootStarterWeb
org.springframework.boot
弹簧起动试验
测试
org.springframework.boot
spring引导启动器数据jpa
mysql
mysql连接器java
朱尼特
朱尼特
测试
org.assertj
assertj核心
3.2.0
测试
org.springframework
弹簧试验
测试
com.github.springtestdbunit
弹簧试验装置
1.0.0
测试
org.dbunit
单元测试
2.5.1
测试
朱尼特
朱尼特
org.springframework.boot
springbootmaven插件

如果有人能找出这一错误的根本原因,我们将不胜感激

Well
com.github.springtestdbunit
依赖版本
1.0.0
需要(已在其pom中定义-请参阅相关github页面):
3.0.5.发布

但是,
org.springframework.boot
依赖版本
1.3.2.发行版
要求:
4.2.4.发布

因此,您的应用程序中有两个不同的spring版本

为了兼容,您可以将
com.github.springtestdbunit
升级到
1.2.1
版本,这是最新版本,需要spring
4.1.4.RELEASE
(),并将
org.springframework.boot
版本降级到
1.2.1.RELEASE
,该版本也使用spring
4.1.4.RELEASE
()


org.springframework.boot
spring启动程序父级
1.2.1.发布
com.github.springtestdbunit
弹簧试验装置
1.2.1
测试

几乎总是意味着您的版本不匹配。发布您的POM或Gradle构建文件。请注意,该教程已经有三年的历史了,您可以在@chrylis自动生成一个骨架项目。我已经添加了pom.xml,谢谢。不需要降级到Spring Boot 1.2.1。Spring4.2.x与4.1.x向后兼容,因此仅升级SpringTestDBUnit就足够了。