辅助类型依赖注入在spring boot中不起作用

时间:2018-01-11 12:27:19

标签: java spring spring-boot junit spring-config

根据文档,spring boot将自动检查在使用@Configuration&注释的任何类中创建的bean类对象。将覆盖该类的默认bean&使用在定义时注入的任何属性返回对象。但是当我在junit中测试这个应用程序时,它不会返回任何正在注入的值。我的所有类都在同一个包中定义我的代码如下,

//引擎类

package com.test.simpletest;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class Engine {

private String msg;

public Engine() {
    System.out.println("Engine class is being called");
}

public String getMsg() {
    return msg;
}

public void setMsg(String msg) {
    this.msg = msg;
}
}

//测试配置类

package com.test.simpletest;

import org.springframework.context.annotation.Bean;  
import org.springframework.context.annotation.Configuration;

@Configuration
public class TestConfiguration{

@Bean
public Engine engine() {
    Engine eng = new Engine();
    eng.setMsg("Message is being called");
    return eng;
}
}

// Spring启动主应用

package com.test.simpletest;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SimpleTestExampleApplication {

public static void main(String[] args) {
    SpringApplication.run(SimpleTestExampleApplication.class, args);
}
}

// JUnit Test class

package com.test.simpletest;

import org.junit.Test; 
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationContext;
import 
org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class SimpleTestExampleApplicationTests {

@Autowired 
private Engine engine; 

@Test
public void contextLoads() {

    engine.getMsg();

//Both above and below approach does not work 

//      ApplicationContext apx = new 
AnnotationConfigApplicationContext(TestConfiguration.class);
//      Engine engine = (Engine)apx.getBean(Engine.class);
//      engine.getMsg();
}
}

请帮助我找到解决上述问题的方法。

2 个答案:

答案 0 :(得分:1)

DemoApplication

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);

    }
}

引擎

public class Engine {
    private String msg;

    public Engine() {
        System.out.println("Engine class is being called");
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}

TestConfiguration

@Configuration
public class TestConfiguration {
    @Bean
    public Engine getEngine() {
        Engine eng = new Engine();
        eng.setMsg("Message is being called");
        return eng;
    }
}

DemoApplicationTests

@RunWith(SpringRunner.class)
@SpringBootTest
@Import(TestConfiguration.class)
public class DemoApplicationTests {

    @Autowired
    private Engine engine;

    @Test
    public void contextLoads() {
        System.out.println("engine : " + engine.getMsg());
    }

}

输出

Engine class is being called
engine : Message is being called

答案 1 :(得分:-1)

您可以从Engine类中删除@Component,然后重试。我想它应该可以正常工作。