Spring启动单元junit测试没有加载配置

时间:2016-10-04 05:26:08

标签: spring-boot

我正在尝试单元测试Spring Boot Application。作为main方法的一部分,我在init服务中调用Configuration方法来进行一些数据设置。 Configuration服务自动装配Description服务。当我尝试单元测试Description服务时,由于init服务中未调用Configuration方法,因此抛出NPE。如何解决这个问题。

BatchService:

@Configuration
@EnableAutoConfiguration
@ComponentScan("com.test.poc")
public class BatchService {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = null;
        SpringApplication application = new SpringApplication(BatchService.class);
        try{
            context =  application.run();
            //Initialize
            Configuration config = (Configuration)context.getBean("Configuration");
            config.init();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

ConfigurationService:

@Service
public class Configuration {
    private ConfigValue value = null;
    public void init(){
        //
    }
    public String getValue(){
        return value.getNameValue();
   }
}

DescriptionService:

@Service
public class DescriptionService {

    @Autowired Configuration config;

    public List<String> getDescription(){
        String value = config.getValue();
    }
}

AbstractAutonomicsTest:

@ActiveProfiles("test")
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = BatchService.class)
@TestPropertySource(locations="classpath:application-test.properties")
public abstract class AbstractAutonomicsTest {

}

DescriptionClusteringServiceTest:

public class DescriptionClusteringServiceTest extends AbstractAutonomicsTest  {

    @Autowired DescriptionClusteringService descService;

    @Test
    public void testDescription(){
        List<String> out = descService.getDescription();
    }
}

1 个答案:

答案 0 :(得分:1)

不要自己调用方法,而是让框架为您完成。只需使用init注释@PostConstruct方法,以便在注入依赖项后调用它。

@Service
public class Configuration {
    private ConfigValue value = null;

    @PostConstruct
    public void init(){
        //
    }
    public String getValue(){
        return value.getNameValue();
   }
}

现在您还可以清理BatchService。注意我建议使用@SpringBootApplication而不是3个单独的注释,如果您的BatchService位于com.test.poc包(或超级包)中,则可以从scanBasePackage或{@ComponentScan中移除@SpringBootApplication(scanBasePackages="com.test.poc"). public class BatchService { public static void main(String[] args) { SpringApplication.run(BatchService.class, args); } } 或值{1}}。

volatile