2016-10-04 87 views
0

我試圖單元測試春天啓動的應用。作爲main方法的一部分,我在調用服務Configuration方法init做一些數據的設置。 Configuration服務在Description服務自動裝配。當我試圖單元測試Description服務,NPE作爲init方法不Configuration服務調用拋出。如何解決這個問題。春天開機單元的JUnit測試不加載配置

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

自己調用該方法代替,讓框架爲你做它。只是註釋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包(或超級包),你可以刪除@ComponentScanscanBasePackage或價值。

@SpringBootApplication(scanBasePackages="com.test.poc"). 
public class BatchService { 
    public static void main(String[] args) { 
     SpringApplication.run(BatchService.class, args); 
    } 
}