我正在尝试单元测试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();
}
}
答案 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