Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.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 测试时JPQL查询使用的模拟存储库_Java_Spring_Unit Testing_Junit_Mockito - Fatal编程技术网

Java 测试时JPQL查询使用的模拟存储库

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

我想用相关的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> 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
    }
}