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

我是 spring框架的新手,并且使用 Spring Context对其依赖注入功能有疑问.

这是我正在尝试编写集成测试的类:

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来决定要注入的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>

有任何想法吗?

解决方法

要明确区分单元和集成测试(跳过关于每个类别的含义的争论) – 您可以通过两种方式测试您的服务:

>通过集成测试 – 启动整个Spring Context并将服务作为单例bean进行测试.
>通过单元测试 – 您只需自己初始化服务,模拟需要模拟的内容,而不需要Spring.

我的建议是不要混合Spring和模拟如果你可以帮助它 – 保持Mockito进行单元测试(这是你需要的东西)并使用集成测试来引导整个Spring上下文来测试其他东西 – 持久性问题,交易等

你不需要Spring来模拟一个类的协作者,并与Mockito进行简单的交互测试.

相关文章

Java中的String是不可变对象 在面向对象及函数编程语言中,不...
String, StringBuffer 和 StringBuilder 可变性 String不可变...
序列化:把对象转换为字节序列的过程称为对象的序列化. 反序...
先说结论,是对象!可以继续往下看 数组是不是对象 什么是对...
为什么浮点数 float 或 double 运算的时候会有精度丢失的风险...
面试题引入 这里引申出一个经典问题,看下面代码 Integer a ...