Java JMockit无法捕获spring数据jpa存储库调用
通过使用JMockit@capting,它无法捕获对任何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
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)将模拟对象注入到测试对象中