Java 测试时JPQL查询使用的模拟存储库
我想用相关的JPQL测试CRUD存储库:Java 测试时JPQL查询使用的模拟存储库,java,spring,unit-testing,junit,mockito,Java,Spring,Unit Testing,Junit,Mockito,我想用相关的JPQL测试CRUD存储库: @Repository public interface UserRolesRepository extends CrudRepository<UserRoles, Long> { @Query("SELECT a.role FROM UserRoles a, UserEntity b WHERE b.username=?1 AND a.id=b.id") public List<String> findRoleByUserNa
@Repository
public interface UserRolesRepository extends CrudRepository<UserRoles, Long> {
@Query("SELECT a.role FROM UserRoles a, UserEntity b WHERE b.username=?1 AND a.id=b.id")
public List<String> findRoleByUserName(String name);
}
是的,您可以在这里使用
@MockBean
,Spring Boot包含一个@MockBean注释,可用于为bean定义Mockito mock
在应用程序上下文中。您可以使用注释添加新bean,或替换单个bean
现有bean定义。注释可以直接用于测试类、测试中的字段,
或在@Configuration类和字段上。在字段上使用时,创建的模拟的实例将
也可以注射。模拟bean在每个测试方法之后自动重置
@RunWith(SpringRunner.class)
@DataJpaTest
@Transactional
public class SpringBootJPATest {
@MockBean
private BlogEntryRepository blogEntryRepository;
@Autowired
private TestEntityManager entityManager;
@Test
public void jpa_test() {
BlogEntry entity = new BlogEntry();
entity.setTitle("Test Spring Boot JPA Test");
BlogEntry persist = entityManager.persist(entity);
System.out.println(persist.getId());
}
@Test
public void jap_test_repo() {
BlogEntry entity = new BlogEntry();
entity.setTitle("Test Spring Boot JPA Test");
BlogEntry persist = blogEntryRepository.save(entity);
// System.out.println(persist.getId()); // This line will get a NPE as the repo is using the mocked bean
}
}
不幸的是,not work for me:/抛出一个初始化错误:
java.lang.ArrayStoreException:sun.reflect.annotation.TypeNotPresentExceptionProxy
我一直在尝试使用@InjectMock,但没有成功。此查询无法正常工作:userRolesRepository.findRoleByUserName(user.getUsername())
@zfChaos我在这里使用的是sprint boot 1.4,您使用的是哪个版本?1.3.5,但我已更改为1.4以测试此解决方案。控制台输出:Hibernate:插入用户角色(id,role,user_id)值(null,,?)
,因此这会给真实数据库带来麻烦。@您需要为实体添加id生成,例如,添加@id@GeneratedValue(strategy=GenerationType.AUTO)私有长id代码>主键。我已经找到了。它与@Autowired
一起工作@DataJpaTest
导致上述错误。
Expected :[ROLE_USER]
Actual :[]
@RunWith(SpringRunner.class)
@DataJpaTest
@Transactional
public class SpringBootJPATest {
@MockBean
private BlogEntryRepository blogEntryRepository;
@Autowired
private TestEntityManager entityManager;
@Test
public void jpa_test() {
BlogEntry entity = new BlogEntry();
entity.setTitle("Test Spring Boot JPA Test");
BlogEntry persist = entityManager.persist(entity);
System.out.println(persist.getId());
}
@Test
public void jap_test_repo() {
BlogEntry entity = new BlogEntry();
entity.setTitle("Test Spring Boot JPA Test");
BlogEntry persist = blogEntryRepository.save(entity);
// System.out.println(persist.getId()); // This line will get a NPE as the repo is using the mocked bean
}
}