【问题标题】:How @Autowire works in spring-boot unit test?@Autowire 如何在 spring-boot 单元测试中工作?
【发布时间】:2019-11-06 16:52:42
【问题描述】:

我想知道@autowire 在这里是如何工作的?

我正在练习如何在 Spring 中使用 mock 进行单元测试。

这是我的简单用户服务的代码

@Service
public class UserService {

    @Autowired
    UserRepository userRepository;

    public User findByName(String name) {

        return userRepository.findByName(name);
    }
}

这是我的单元测试代码。

package com.geotab.dna.springtestdemo.services;

import com.geotab.dna.springtestdemo.entities.User;
import com.geotab.dna.springtestdemo.repositories.UserRepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.context.annotation.Bean;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
public class UserServiceTest {

    @TestConfiguration
    static class UserServiceImplContextConfiguration {

        @Bean
        public UserService userService() {
            UserService userService = new UserService();
            return userService;
        }
    }

    @Autowired
    private UserService userService;

    @MockBean
    private UserRepository userRepository;

    @Test
    public void whenFindByName_thenReturnUser() {

        //given
        String name = "alex";
        User user = new User(name);
        Mockito.when(userRepository.findByName(name)).thenReturn(user);

        //when
        User found = userService.findByName("alex");

        //then
        assert (user.getName().equals(found.getName()));
    }
}

我从博客中得到了上面的代码,它可以工作。但是我很困惑为什么可以将 UserRepository 注入到 UserService 中?因为一开始我认为 UserService.UserRepository 将为空。

【问题讨论】:

    标签: spring-boot unit-testing mocking autowired


    【解决方案1】:

    看看程序的不同部分你有什么

    1. @RunWith(SpringRunner.class)你正在使用 Spring 提供的 runner 类
    2. @Autowire 当它遇到这个语句时,它会在它的应用程序上下文中搜索类。

    现在来谈谈 userRepository 对象是如何注入到 userService 中的。这是因为@MockBean。从它说的文档中

    可用于向 Spring 添加模拟的注解 应用程序上下文。可用作类级别注释或 @Configuration 类或测试类中的字段 @RunWith SpringRunner。

    这意味着当 spring 遇到 @MockBean 时,它会将该 bean 添加到应用程序上下文中。因此,当它在 userService 内部的 userRepository 上遇到 @Autowired 时,它会注入它拥有的模拟实例。
    这个注释是在几个版本中引入的。在此之前,我们必须使用@Mock 声明一个模拟并使用@InjectMocks 或使用构造注入。

    查看question 了解更多关于@Mock@MockBean 之间的区别

    【讨论】:

      猜你喜欢
      • 2016-05-28
      • 1970-01-01
      • 1970-01-01
      • 2017-02-08
      • 1970-01-01
      • 2015-12-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多