@Autowire 如何在 spring-boot 单元测试中工作?
How @Autowire works in spring-boot unit test?
我想知道@autowire 在这里是如何工作的?
我正在练习如何在 Spring 中使用 mock 进行单元测试。
这是我的简单 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 将是空的。
看看程序的不同部分你有什么
@RunWith(SpringRunner.class)
您正在使用由 Spring 提供的跑步者 class
@Autowire
使 spring 在遇到此语句时在其应用程序上下文中搜索 class。
现在说到 userRepository 对象是如何注入到 userService 中的。这是因为 @MockBean
。从文档中可以看出
Annotation that can be used to add mocks to a Spring
ApplicationContext. Can be used as a class level annotation or on
fields in either @Configuration classes, or test classes that are
@RunWith the SpringRunner.
这意味着当 spring 遇到 @MockBean
时,它会将那个 bean 添加到应用程序上下文中。因此,当它在 userService 中的 userRepository 上遇到 @Autowired
时,它会注入它拥有的模拟实例。
这个注释是在几个版本中引入的。在此之前,我们必须使用 @Mock
和 @InjectMocks
或使用构造注入来声明模拟。
查看此 以了解 @Mock
和 @MockBean
之间的更多区别
我想知道@autowire 在这里是如何工作的?
我正在练习如何在 Spring 中使用 mock 进行单元测试。
这是我的简单 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 将是空的。
看看程序的不同部分你有什么
@RunWith(SpringRunner.class)
您正在使用由 Spring 提供的跑步者 class
@Autowire
使 spring 在遇到此语句时在其应用程序上下文中搜索 class。
现在说到 userRepository 对象是如何注入到 userService 中的。这是因为 @MockBean
。从文档中可以看出
Annotation that can be used to add mocks to a Spring ApplicationContext. Can be used as a class level annotation or on fields in either @Configuration classes, or test classes that are @RunWith the SpringRunner.
这意味着当 spring 遇到 @MockBean
时,它会将那个 bean 添加到应用程序上下文中。因此,当它在 userService 中的 userRepository 上遇到 @Autowired
时,它会注入它拥有的模拟实例。
这个注释是在几个版本中引入的。在此之前,我们必须使用 @Mock
和 @InjectMocks
或使用构造注入来声明模拟。
查看此 @Mock
和 @MockBean