Spring Unit测试JPA存储库

时间:2014-06-23 14:07:38

标签: java spring unit-testing spring-mvc jpa

我是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());
    }
}

错误:

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

我几乎可以肯定,因为testContext.Class会出现问题。我用这个类测试我的控制器,它运行良好,但现在我需要测试我的数据库,我不知道如何修改contextConfiguration。我希望somone会帮助我。提前谢谢!

3 个答案:

答案 0 :(得分:7)

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

解决方案是使用真实存储库。为此,您需要按照以下步骤操作:

  1. 使用 @Repository 注释注释RoleRepository,并使用 JpaRepository(RoleEntity,ID)扩展该类(其中ID是您声明为RoleEntity的id的类型)
  2. 将RoleRepository添加到Context Configuration类(真实的,不是测试类)。您可以通过添加 @EnableJpaRepositories(value =“your.repository.package”)来实现此目的。
  3. 使用您用于配置基于Spring的项目的真实上下文配置类,从RoleServiceTest类的 @ContextConfiguration 注释替换TestContext.class。
  4. 我希望我的回答有所帮助,如果您仍然需要帮助,请随时再次询问!

答案 1 :(得分:5)

您的存储库是一个模拟对象。根据定义,模拟对象是一个不会做它应该做的事情的对象,而是在测试中告诉它做什么。

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

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

答案 2 :(得分:0)

如果使用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());
}