gpt4 book ai didi

java - 在 Spring 项目中测试 - 使用 Mockito 将存储库注入(inject)服务

转载 作者:行者123 更新时间:2023-11-28 21:21:03 25 4
gpt4 key购买 nike

我试图了解如何在 Spring 项目中使用 Mockito,但我对以下内容有点困惑:

我即将使用真实(内存中)存储库测试服务。我正在 mock 该服务正在使用的所有其他对象。如果我理解正确,用 @Mock 注释对象将被模拟,@Spy 将使用真实对象,而使用 @InjectMocks 将 kind “ Autowiring ”这些带注释的对象。但是,我认为我误解了 @Spy,因为以下代码不起作用(似乎插入了一个模拟对象,既没有数据库交互,也没有出现 NullPointerException):

@SpringBootTest
@RunWith(SpringRunner.class)
public class UserServiceTests {

@Spy
@Autowired
private UserRepository userRepository;

@Mock
private MessageService messageService;

@InjectMocks
private UserService userService = new UserServiceImpl();

@Test
public void testUserRegistration() {
userService.registerUser("test@test.test");

Assert.assertEquals("There is one user in the repository after the first registration.", 1, userRepository.count());
}
}

如果我删除 @Spy 注释并使用反射将存储库插入到服务中,它会起作用:

ReflectionTestUtils.setField(userService, "userRepository", userRepository);

这看起来很不方便,而且我很确定 @Spy 就是用来做这个的。谁能指出我遗漏/误解了什么?

编辑:还有一件事 - 使用 @Spy 注释我在保存时没有得到 NullPointerException,但它看起来像是插入模拟对象而不是真正的存储库。

编辑 2:我认为这是我困惑的答案:

SpringBoot Junit bean autowire

最佳答案

问题是您可能 @Autowired UserService 中的某些服务/存储库如下所示:

public class UserServiceImpl() {

@Autowired
private UserRepository userRepository;
@Autowired
private MessageService messageService;

// ... all the stuff
}

Mockito 尝试通过不可用的构造函数或 setter 注入(inject)模拟。尝试重新设计您的类 UserServiceImpl,使其具有如下构造函数:

public class UserServiceImpl() {

private final UserRepository userRepository;
private final MessageService messageService;

@Autowired
public UserServiceImpl(UserRepository userRepository, MessageService messageService) {
this.userRepository = userRepository;
this.messageService = messageService;
}

然后您可以使用那些模拟的构造函数在 @Before 中实例化服务。

关于java - 在 Spring 项目中测试 - 使用 Mockito 将存储库注入(inject)服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51532894/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com