当前位置: 首页 > 知识库问答 >
问题:

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

殳勇
2023-03-14

通过使用JMockit@Capture,它无法捕获对任何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());
    }
}

然而,通过替换

用户存储库

具有

代码库

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

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

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

任何一个人有什么想法来解决这个问题?

共有1个答案

司徒英卓
2023-03-14

在不知道AbstractServiceTestSpring对@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)将模拟对象注入到测试对象中。

 类似资料:
  • 它是否将其存储在缓存中?我有一个应用程序,但应用程序中没有任何地方。属性是提到的db详细信息。我可以通过邮递员存储数据和查询它。

  • 是否有一种方法可以使通用Spring数据JPA存储库正确处理类似的方法?例如只返回狗,而不返回所有动物?或者至少,最好的变通方法是什么? 它的工作几乎完美,保存每一个动物在自己的桌子上,等等。唯一的问题是:同时返回水豚和狗。这个答案解释说: 这只有在域类使用单表继承时才起作用。我们在引导时能得到的关于domain类的唯一信息是它将是Product对象。因此,对于像findAll()甚至findBy

  • 我显然遗漏了一些东西。我正在制作一个简单的应用程序,其中包含并面临以下错误: 我的代码: 应用程序: pom.xml 控制器: 人事服务: 个人服务: PersonRepository(此存储库不能自动连接): 已经在网上搜索了。我什么都没找到。有什么想法吗?

  • 我们有许多通过接口扩展JpaRepository模式定义的存储库。当运行集成测试或应用程序的某些入口点时,我们只需要这些存储库的一个非常小的子集。 我们可以懒洋洋地加载实际的存储库隐含吗? 相当于@懒在@豆上的东西?注意:我至少尝试了用@lazy注释存储库接口的简单解决方案,但没有成功。

  • 又不想工作,我不知道是怎么回事。 日志包含以下消息: 将项目放在github https://github.com/romanych2021/testjpaspring上