Java Spring单元测试JPA存储库

Java Spring单元测试JPA存储库,java,spring,unit-testing,spring-mvc,jpa,Java,Spring,Unit Testing,Spring Mvc,Jpa,我不熟悉Spring框架。我需要为JPA存储库编写单元测试。我正在尝试简单的存储库saveAndFlush()方法。但是没有任何东西保存在我的存储库中。以下是我的源代码: TestContext.class @Configuration @PropertySource("classpath:log4j.properties") public class TestContext { @Bean public RoleService roleService() {

我不熟悉Spring框架。我需要为JPA存储库编写单元测试。我正在尝试简单的存储库
saveAndFlush()
方法。但是没有任何东西保存在我的存储库中。以下是我的源代码:

TestContext.class

@Configuration 
@PropertySource("classpath:log4j.properties") 
public class TestContext {

    @Bean
    public RoleService roleService() {
        return Mockito.mock(RoleService.class);
    }

    @Bean
    public RightService RightService() {
        return Mockito.mock(RightService.class);
    }

    @Bean
    public RoleRepository RoleRepository() {
        return Mockito.mock(RoleRepository.class); 
    }
}
RoleServiceTest.class

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {TestContext.class})
@WebAppConfiguration
public class RoleServiceTest {

    @Autowired
    private RoleRepository roleRepository;

    @Test
    public void TestServices() throws Exception {
        RoleDetails first = new RoleDetails();
        first.setId("1");
        first.setDescription("First Description");
        first.setName("First");
        roleRepository.saveAndFlush(new RoleEntity(first));
        roleRepository.save(new RoleEntity(first));
        List<RoleEntity> roles = new ArrayList<RoleEntity>();
        roles = roleRepository.findAll();
        System.out.println(roles);
        assertEquals(1, roles.size());
    }
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(类={TestContext.class})
@WebAppConfiguration
公共类角色服务测试{
@自动连线
私人角色扮演者角色扮演者;
@试验
public void TestServices()引发异常{
RoleDetails first=新RoleDetails();
第一,setId(“1”);
第一。设置说明(“第一说明”);
第一。设置名称(“第一”);
roleRepository.saveAndFlush(新RoleEntity(第一个));
保存(新角色(第一个));
列表角色=新的ArrayList();
roles=roleRepository.findAll();
System.out.println(角色);
assertEquals(1,roles.size());
}
}
和错误:

java.lang.AssertionError: expected:<1> but was:<0>
java.lang.AssertionError:应为:但为:

我几乎可以肯定这个问题是因为testContext.Class而发生的。我使用这个类来测试我的控制器,它工作得很好,但是现在我需要测试我的数据库,我不知道如何修改contextConfiguration。我希望有人能帮助我。提前谢谢

您的存储库是一个模拟对象。根据定义,模拟对象是一个不做它通常应该做的事情,但做你在测试中告诉它做的事情的对象

要测试存储库,存储库必须是真实的。因此,您的上下文类应该

@Bean
public RoleRepository RoleRepository() {
    return new RoleRepositoryImpl(); // or whatever the class implementing the repository is 
}

问题确实来自TestContext。您试图使用模拟对象保存对象,这是不正确的

解决方案是使用真正的存储库。为此,您需要执行以下步骤:

  • @Repository注释您的角色库,并用JpaRepository(RoleEntity,ID)扩展类(其中ID是您声明角色库ID的类型)
  • 将RoleRepository添加到上下文配置类(真实的,而不是测试的)。您可以通过添加@EnableJpaRepositories(value=“your.repository.package”)来实现这一点
  • 将RoleServiceTest类上的@ContextConfiguration注释中的TestContext.class替换为用于配置基于Spring的项目的真实上下文配置类

  • 我希望我的回答有帮助,如果你仍然需要帮助,请随时再问

    如果使用Spring Boot创建web应用程序,并且在Application.class中运行main()方法,则可以使用:

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringApplicationConfiguration(classes = Application.class)
    @WebAppConfiguration
    public class MyUnitTest {
    
        Some someInstance = new Some();
    
        @Autowired
        private SomeRepository someRepository;
    }
    
    @Test
    public void testSomeClass() throws Exception {
        Some savedSome = someRepository.save(someInstance);
        assertEquals(1, someRepository.count());
    }
    

    这在技术上是正确的,但许多Spring数据存储库使用自动实现逻辑来执行基本CRUD操作。试图直接实例化它们是行不通的;您应该演示如何使用
    @Autowired
    @Resource
    获取它们。这实际上是一个集成测试,而不是单元测试,对吗?mockito runner用于单元测试,springjunit runner用于集成哪里是真实的,哪里是测试上下文配置类?