@ComponentScan无法使用spring-boot-starter-test进行测试

时间:2014-05-16 17:49:29

标签: java spring unit-testing spring-boot component-scan

我正在尝试使用spring-boot-starter-test测试项目中的@Service@Repository类,而@Autowired对我正在测试的类不起作用。

单元测试:

@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(classes = HelloWorldConfiguration.class
//@SpringApplicationConfiguration(classes = HelloWorldRs.class)
//@ComponentScan(basePackages = {"com.me.sbworkshop", "com.me.sbworkshop.service"})
//@ConfigurationProperties("helloworld")
//@EnableAutoConfiguration
//@ActiveProfiles("test")
// THIS CLASS IS IN src/test/java/ AND BUILDS INTO target/test-classes
public class HelloWorldTest {

    @Autowired
    HelloWorldMessageService helloWorldMessageService;

    public static final String EXPECTED = "je pense donc je suis-TESTING123";

    @Test
    public void testGetMessage() {
        String result = helloWorldMessageService.getMessage();
        Assert.assertEquals(EXPECTED, result);
    }
}

服务:

@Service
@ConfigurationProperties("helloworld")
// THIS CLASS IS IN /src/main/java AND BUILDS INTO target/classes
public class HelloWorldMessageService {

    private String message;

    public String getMessage() {
        return message;
    }

    public void setMessage(String  message) {
        this.message=message;
    }

}

单元测试中注释的类注释代表了我试图使其工作的各种事物。测试和项目包位于相同的包路径中,@ComponentScan可以从我的入口点(@RestController类使用main方法)正常工作。服务@ComponentScan@Autowire在src / main / java方面的@RestController类中很好,但在测试中没有。我需要在@Bean课程中再次将其添加为@Configuration,以便@Autowired能够正常工作。该类在其他范围内就好了,我可以在测试中引用并实例化它。问题似乎是@ComponentScan似乎没有正确遍历我的测试运行器类路径中的多个条目,在本例中为/ target / test-classes和/ target / classes。

我使用的IDE是IntelliJ IDEA 13。

UPDATE - 这是HelloWorldRs及其配置:

@RestController
@EnableAutoConfiguration
@ComponentScan
public class HelloWorldRs {

    //    SPRING BOOT ENTRY POINT - main() method
    public static void main(String[] args) {
        SpringApplication.run(HelloWorldRs.class);
    }

    @Autowired
    HelloWorldMessageService helloWorldMessageService;

    @RequestMapping("/helloWorld")
    public String helloWorld() {
        return helloWorldMessageService.getMessage();
    }

}

...

@Configuration
public class HelloWorldConfiguration {

    @Bean
    public Map<String, String> map() {
        return new HashMap<>();
    }

    // This bean was manually added as a workaround to the @ComponentScan problem
    @Bean
    public HelloWorldMessageService helloWorldMessageService() {
        return new HelloWorldMessageService();
    }

    // This bean was manually added as a workaround to the @ComponentScan problem
    @Bean
    public HelloWorldRs helloWorldRs() {
        return new HelloWorldRs();
    }
}

2 个答案:

答案 0 :(得分:1)

我不知道这是否会成为解决方案,但不要使用默认包(即不要将* .java放在&#34; src / main / java&#34;直接),绝对不要在默认包中使用@ComponentScan@EnableAutoConfiguration。在尝试扫描类路径上的所有内容时(包括所有Spring库),您最终会在启动时终止应用程序。

答案 1 :(得分:1)

首先,我建议使用较新的@RunWith(SpringRunner.class),但这没有任何区别,只是更短(并推荐)。

其次,从@EnableAutoConfiguration我看到你正在使用弹簧靴 - 这当然是件好事。 直接使用@ComponentScan有一些很好的理由。你能试试以下吗?

@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(classes=YourApplication_or_other_Configuration.class)
public class HelloWorldTest {
... etc.