Java JMockit无法捕获spring数据jpa存储库调用

Java JMockit无法捕获spring数据jpa存储库调用,java,spring-data-jpa,jmockit,Java,Spring Data Jpa,Jmockit,通过使用JMockit@capting,它无法捕获对任何spring数据jpa存储库方法的调用 public interface UserRepository extends JpaRepository<UserEntity, Long> { UserEntity findByName(String name); } public class DefaultUserService implements UserService { public User getU

通过使用JMockit@capting,它无法捕获对任何spring数据jpa存储库方法的调用

public interface UserRepository extends JpaRepository<UserEntity, Long> {

    UserEntity findByName(String name);
}

public class DefaultUserService implements UserService {

    public User getUser(Long id) {
        return userRepo.findOne( id );
    }

    public User getUser(String name) {
        return userRepo.findByName( name );
    }
}

public class UserServiceTest extends AbstractServiceTest {

    @Inject UserService userService;
    **@Capturing UserRepository userRepo;**

    @Test
    public void getUser_ShouldReturnUserObject() {
        **new Expectations() {{
            userRepo.findByName(anyString);
            result = new UserEntity(1l, null, null, null, null);
        }};**

        User user = userService.getUser("abc");

        assertNotNull(user.getId());
        assertEquals(1l, user.getId().longValue());
    }
}
public interface UserRepository扩展了JpaRepository{
UserEntity findByName(字符串名称);
}
公共类DefaultUserService实现UserService{
公共用户getUser(长id){
返回userRepo.findOne(id);
}
公共用户getUser(字符串名称){
返回userRepo.findByName(名称);
}
}
公共类UserServiceTest扩展了AbstractServiceTest{
@注入UserService-UserService;
**@捕获用户存储库userRepo**
@试验
public void getUser\u ShouldReturnUserObject(){
**新期望(){{
userRepo.findByName(anyString);
结果=新用户实体(1l,null,null,null,null);
}};**
User=userService.getUser(“abc”);
assertNotNull(user.getId());
assertEquals(1l,user.getId().longValue());
}
}
然而,通过替换

用户存储库

JpaRepository

在测试类中,JMockit能够拦截对JpaRepository接口中可用的任何方法的调用,如findOne()或findAll()

但它无法捕获对扩展JpaRepository的自定义存储库方法的调用,如findByName()

我更喜欢在这个场景中使用@capture,尽管基于JMockit状态的测试(如模型和解封)可以解决这个问题,因为它要简单得多


任何人都有办法解决这个问题吗?

如果不知道
AbstractServiceTest
+Spring对
@Inject
字段做了什么,我就说不出
@Capturing
失败的原因。也许Spring创建了一个代理对象,它将委托给另一个代理对象,但即使如此

无论如何,这样的单元测试可以更容易地编写:

public class UserServiceTest
{
    @Tested DefaultUserService userService;
    @Injectable UserRepository userRepo;

    @Test
    public void getUser_ShouldReturnUserObject()
    {
        new Expectations() {{
            userRepo.findByName(anyString);
            result = new User(1l, null, null, null, null);
        }};

        User user = userService.getUser("abc");

        assertNotNull(user.getId());
        assertEquals(1l, user.getId().longValue());
    }
}
除非您想要执行集成测试,否则通常最好让模拟工具(在本例中为JMockit)将模拟对象注入到测试对象中