gpt4 book ai didi

java - 在每个单元测试后创建一个新的 bean 实例

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:58:46 25 4
gpt4 key购买 nike

我是 spring 框架的新手,对使用 Spring Context 的依赖注入(inject)功能有疑问。

这是我要为其编写集成测试的类:

public class UserService {

private Validator validator;
private UserRepository userRepository;
private Encryptor encryptor;
private MailService mailService;

...

public void registerUser(User user) {
user.setPassword(encryptor.encrypt(user.getPassword()));

Errors errors = new BindException(user, "user");
validator.validate(user, errors);

if (errors.getErrorCount() == 0) {
userRepository.addUser(user);
mailService.sendMail(user.getEmail());
}
}

在我的测试中(使用 Mockito),我想确保这四个项目被调用,所以我创建如下测试:

public void testRegisterCallsValidateInValidator() {
userService.registerUser(testUser);
verify(userService.getValidator(), times(1)).validate(any(User.class), any(Errors.class));
}

然而,所有测试都失败了,说我多次调用了该方法。我唯一的猜测是 UserService bean 在所有测试开始时创建一次,但在每次测试后都不会重新加载。

在我的测试配置中,我使用以下 xml 来决定注入(inject)哪些 bean:

<bean id="userService" class="be.kdg.coportio.services.UserService">
<property name="validator" ref="validator"/>
<property name="userRepository" ref="userRepository"/>
<property name="encryptor" ref="encryptor"/>
<property name="mailService" ref="mailService"/>
</bean>

有什么想法吗?

最佳答案

您正在重用上下文,为了使测试彼此独立,您可能需要在每次测试后刷新上下文以重置所有内容。

我假设您使用的是 Junit 4.5+。它与其他测试框架类似。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"mycontext.xml"})
@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)
public class MyTestClass {
...
// my tests
...
}

如果需要“修复”的方法很少,您可以将 @DirtiesContext 放在方法级别,但如果您使用的是 Spring,则最好的选择是在每次测试后进行。

无论如何,我认为您不应该在集成测试中使用模拟/ spy :

  • 在单元测试中,使用模拟(如果需要)并手动注入(inject)。在这里,您希望将测试 bean 的行为作为一个单元进行验证,因此您可以使用 mock 将其与其余 bean 隔离开来。这还有一个优点,即 JUnit 通过为每个测试使用不同的测试类实例来隔离您的测试,因此除非您使用 static 或其他对测试不友好的做法,否则一切都会正常进行。

  • 在集成测试中,使用真正的 beans 并让 Spring 注入(inject)。这里的目标是验证 beans 彼此/与环境(数据库、网络等)交互良好。您想在这里隔离 beans,因此您不应该使用模拟。

参见 Spring documentation about testing以获得更详细的解释。

关于java - 在每个单元测试后创建一个新的 bean 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9224406/

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