@Autowire如何在Spring-boot单元测试中工作?

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

我正准备练习如何在Spring中使用模拟进行单元测试。

这是我简单的UserService的代码

@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将为null。

jiang8com 回答:@Autowire如何在Spring-boot单元测试中工作?

只需查看程序的不同部分

  1. @RunWith(SpringRunner.class)您使用的是Spring提供的赛跑者类
  2. @Autowire,当它包含此语句时,可以在其应用程序上下文中春季搜索类。

现在到了如何将userRepository对象注入到userService中的地步。这是因为@MockBean。从文档中说

  

可用于向Spring添加模拟的注释   ApplicationContext。可用作类级别的注释或   @Configuration类或测试类中的字段   @RunWith SpringRunner。

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

请查看此question,以详细了解@Mock@MockBean之间的区别

本文链接:https://www.f2er.com/3156442.html

大家都在问