Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring中的单元测试:将依赖项注入到被测组件中_Java_Spring_Unit Testing - Fatal编程技术网

Java Spring中的单元测试:将依赖项注入到被测组件中

Java Spring中的单元测试:将依赖项注入到被测组件中,java,spring,unit-testing,Java,Spring,Unit Testing,我有一个非常简单的rest控制器: @RestController public class MyController { @Autowired public Logger logger; 记录器依赖项通过以下配置注入: @Configuration public class MyConfig { @Bean public Logger logger() { return LoggerFactory.getLogger(MyController.

我有一个非常简单的rest控制器:

@RestController
public class MyController {
    @Autowired
    public Logger logger;
记录器依赖项通过以下配置注入:

@Configuration
public class MyConfig {
    @Bean
    public Logger logger() {
        return LoggerFactory.getLogger(MyController.class);
    }
@Configuration
@Profile("test")
public class MyTestConfig {
    @Bean
    public Logger logger() {
        return LoggerFactory.getLogger(MyCOntroller.class);
    }
如果我运行包含控制器的Spring应用程序,那么一切都正常。但是,在运行单元测试时,我无法实现这种依赖注入。在这种情况下,我有以下测试配置:

@Configuration
public class MyConfig {
    @Bean
    public Logger logger() {
        return LoggerFactory.getLogger(MyController.class);
    }
@Configuration
@Profile("test")
public class MyTestConfig {
    @Bean
    public Logger logger() {
        return LoggerFactory.getLogger(MyCOntroller.class);
    }
这是我的单元测试代码的相关部分:

@RunWith(MockitoJUnitRunner.class)
@ContextConfiguration(classes = MyTestConfig.class)
@ActiveProfiles("test")
public class MyContollerTest {
但是,logger对象在MyController中没有“自动连接”(注意,我不想模拟logger对象),这会导致指针引用为空


我遗漏了什么?

单元测试不应该使用任何Spring配置。您应该简单地实例化组件,并手动注入依赖项(通常是假的依赖项)

您使用了场注入,这使它更难。使用构造函数注入,您需要做的就是

Logger logger = LoggerFactory.getLogger(MyController.class);
MyController controller = new MyController(logger);
Mockito可以帮助您注入假依赖项,即使在使用字段注入时,也要感谢
@Mock
@Spy
@InjectMocks
注释:

@Spy
private Logger logger = LoggerFactory.getLogger(MyController.class);

@InjectMocks
private MyController controller;

@Before
public void prepare() {
    MockitoAnnotations.initMocks(this);
}

也就是说,如果我没有弄错的话,您没有使用
@RunWith(SpringJUnit4ClassRunner.class)
,因此您的测试运行程序对Spring一无所知,因此不会创建或使用任何Spring配置。

是的,
SpringJUnit4ClassRunner
才是真正的罪魁祸首,这更像是一个集成而不是单元测试。似乎我在用Spring编写单元测试时采取了错误的方法。使用现场注入并在单元测试中保留Spring似乎是一种方法。谢谢你的解释。这个问题相关吗?你链接的问题中有很多有用的链接。谢谢