Spring Boot JPA 测试因 java.lang.IllegalArgumentException 而失败

萨明达·佩拉穆纳

我正在尝试测试我的 JPA 存储库接口。这是一个简单的 Spring Boot Web 应用程序,用于上传和处理 CSV 文件。以下是我需要测试的存储库。

package bloombergfx.data;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import bloombergfx.model.CSVFile;

@Repository
public interface CSVFileRepository extends JpaRepository<CSVFile, Long> {

    CSVFile findByFileName(String fileName);

    <S extends CSVFile> S save(S file);
}

我创建的测试类用于测试上述存储库。

package bloombergfx.data;

import static org.assertj.core.api.Assertions.assertThat;

import java.util.Date;

import javax.transaction.Transactional;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager;
import org.springframework.test.context.junit4.SpringRunner;

import bloombergfx.model.CSVFile;
import bloombergfx.model.InvalidRecord;
import bloombergfx.model.Record;
import bloombergfx.model.ValidRecord;

@RunWith(SpringRunner.class)
@DataJpaTest(showSql = true)
@Transactional
public class CSVFileRepositoryTest {

    @Autowired
    private TestEntityManager entityManager;

    @Autowired
    private CSVFileRepository csvFileRepository;

    private CSVFile file;

    @Before
    public void setup() {
        CSVFile file = new CSVFile();
        file.setFileName("test_file");
        file.getValidRecords().add((ValidRecord) new Record(1, "USD", "AED", new Date(), 100.00, file).validate());
        file.getInvalidRecords().add((InvalidRecord) new Record(2, "USD", "USD", new Date(), 100.00, file).validate());
    }

    @Test
    public void testFindByFileName() {
        entityManager.persist(file);
        entityManager.flush();

        CSVFile found = csvFileRepository.findByFileName(file.getFileName());

        assertThat(found).isEqualTo(file.getFileName());
    }

    @Test
    public void testSaveS() {
        CSVFile saved = entityManager.persist(file);
        entityManager.flush();

        assertThat(saved).isEqualTo(file);
    }
}

我使用了以下 gradle 设置进行测试。

testCompile("org.springframework.boot:spring-boot-starter-test")
testCompile("com.h2database:h2")

当我运行测试时,我收到以下错误。

2017-11-29 16:19:08.993  INFO 10968 --- [           main] o.s.t.c.transaction.TransactionContext   : Began transaction (1) for test context [DefaultTestContext@3d299e3 testClass = CSVFileRepositoryTest, testInstance = bloombergfx.data.CSVFileRepositoryTest@3a079870, testMethod = testFindByFileName@CSVFileRepositoryTest, testException = [null], mergedContextConfiguration = [MergedContextConfiguration@55a561cf testClass = CSVFileRepositoryTest, locations = '{}', classes = '{class bloombergfx.Application}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true}', contextCustomizers = set[[ImportsContextCustomizer@3b938003 key = [org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration, org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration, org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration, org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration, org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration, org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration, org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManagerAutoConfiguration]], org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@1a8a8f7c, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@42f93a98, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.autoconfigure.OverrideAutoConfigurationContextCustomizerFactory$DisableAutoConfigurationContextCustomizer@7ce6a65d, org.springframework.boot.test.autoconfigure.filter.TypeExcludeFiltersContextCustomizer@351584c0, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@cb5211d5, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@63440df3], contextLoader = 'org.springframework.boot.test.context.SpringBootContextLoader', parent = [null]]]; transaction manager [org.springframework.orm.jpa.JpaTransactionManager@62c72501]; rollback [true]
2017-11-29 16:19:09.055  INFO 10968 --- [           main] o.s.t.c.transaction.TransactionContext   : Rolled back transaction for test context [DefaultTestContext@3d299e3 testClass = CSVFileRepositoryTest, testInstance = bloombergfx.data.CSVFileRepositoryTest@3a079870, testMethod = testFindByFileName@CSVFileRepositoryTest, testException = java.lang.IllegalArgumentException: attempt to create create event with null entity, mergedContextConfiguration = [MergedContextConfiguration@55a561cf testClass = CSVFileRepositoryTest, locations = '{}', classes = '{class bloombergfx.Application}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true}', contextCustomizers = set[[ImportsContextCustomizer@3b938003 key = [org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration, org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration, org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration, org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration, org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration, org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration, org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManagerAutoConfiguration]], org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@1a8a8f7c, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@42f93a98, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.autoconfigure.OverrideAutoConfigurationContextCustomizerFactory$DisableAutoConfigurationContextCustomizer@7ce6a65d, org.springframework.boot.test.autoconfigure.filter.TypeExcludeFiltersContextCustomizer@351584c0, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@cb5211d5, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@63440df3], contextLoader = 'org.springframework.boot.test.context.SpringBootContextLoader', parent = [null]]].
2017-11-29 16:19:09.074  INFO 10968 --- [       Thread-3] s.c.a.AnnotationConfigApplicationContext : Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@543588e6: startup date [Wed Nov 29 16:19:04 GST 2017]; root of context hierarchy
2017-11-29 16:19:09.089  INFO 10968 --- [       Thread-3] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'

当 TestEntityManager 尝试保留数据时会发生错误。

迈克尔·阿尔滕伯格

您应该编辑方法的第一行@Before,使其显示为:

@Before
public void setup() {
    file = new CSVFile();
    file.setFileName("test_file");
    file.getValidRecords().add((ValidRecord) new Record(1, "USD", "AED", new Date(), 100.00, file).validate());
    file.getInvalidRecords().add((InvalidRecord) new Record(2, "USD", "USD", new Date(), 100.00, file).validate());
}

目前您正在使用一个局部变量并操作这个局部变量。file永远不会设置实例变量,因此您试图保留一个空对象,这当然不起作用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Spring Boot 应用程序:java.lang.IllegalArgumentException:必须至少存在一个 JPA 元模型

Spring JPA 测试 java.lang.IllegalStateException

部署到Apache 7.0.54和Java 8时,Spring上下文初始化因java.lang.IllegalArgumentException而失败。

JPA:java.lang.IllegalArgumentException:不是实体

Spring Boot:java.lang.IllegalArgumentException:发现了多个名称为[spring_web]的片段

grails spock测试失败,出现“ java.lang.IllegalArgumentException:ServletContext不能为空”

错误:java.lang.IllegalArgumentException 无法使用 Graphql 在 Spring Boot 中转换 LocalDate?

Spring-boot + JPA EntityManager注入失败

一些RDD操作因Java IllegalArgumentException而失败

Android Studio启动失败-Java.lang.IllegalArgumentException

Spring Boot:处理程序调度失败;嵌套的异常是java.lang.NoSuchMethodError

Spring Boot DataJpaTest(用于存储库)失败,并出现java.lang.IllegalStateException:无法加载ApplicationContext

Spring Data Jpa 保存测试失败

Spring启动数据JPA任务:测试失败

Spring Boot无法识别我的Jpa存储库不是托管类型:类java.lang.Long

没有Spring Boot的Java Spring测试-错误java.lang.IllegalStateException:无法加载ApplicationContext

没有Spring Boot的Java Spring测试-错误java.lang.IllegalStateException:无法加载ApplicationContext

使用liquibase的Spring Boot测试失败

Spring Sleuth + Zuul = java.lang.IllegalArgumentException: 格式错误的 id

骆驼测试-java.lang.IllegalArgumentException:必须指定defaultEndpoint

用Gradle,Groovy和spring-boot进行springload失败,并出现java.lang.NoSuchFieldException:classCache

Spring Boot java.lang.NullPointerException:空

Java程序因某些测试用例超时而失败

init 方法调用失败;嵌套异常是 java.lang.IllegalArgumentException: 'sessionFactory' 或 'hibernateTemplate' 是必需的

Android构建失败-java.lang.IllegalArgumentException:已添加:Lcom / google / api / client / escape / CharEscapers;

Spark Full Rdd joinWithCassandraTable java.lang.IllegalArgumentException:要求失败:无效的行大小:而不是

Android构建失败-java.lang.IllegalArgumentException:对通配符的引用必须为数字(*)

下载100%后,Flutter节目下载失败,并出现java.lang.IllegalArgumentException

getPlaceByID()始终失败,并出现java.lang.IllegalArgumentException:缓冲区已关闭