簡體   English   中英

如何僅在 JUnit 春季測試中自動裝配特定類?

[英]How to only autowire a specific class in JUnit spring test?

我想寫一種集成測試,但只針對特定的類。 這意味着我希望該類中的所有字段都自動連接,但忽略同一目錄中的任何類。

那可能嗎?

例子:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = {TestConfig.class})
public class JunitTest {
    @Autowired
    private MyService service;
}

//how to only scan that specific class?
@ComponentScan(basePackageClasses = {MyService.class, MyInjectedService.class})
@Configuration
public class TestConfig {

}


@Service
public class MyService {
    @Autowired
    private MyInjectedService service;
}

在這里,我希望 spring 忽略與提到的兩個basePackageClasses相同目錄中的任何類。

@ContextConfiguration@SpringApplicationConfiguration支持的classes屬性只需要引用注解的類 它們不必是@Configuration類。

因此,考慮到這一點,您應該能夠完全放棄組件掃描並簡單地聲明您的兩個帶注釋的組件,如下所示:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = {MyService.class, MyInjectedService.class})
public class JUnitTest {
    @Autowired
    private MyService service;

    // ...
}

話雖如此,如果以上是您的目標,那么使用 Spring Boot 的測試支持可能沒有任何意義。 換句話說,如果MyServiceMyInjectedService不依賴 Spring Boot 的任何特性,您可以放心地將@SpringApplicationConfiguration替換為@ContextConfiguration

問候,

Sam( Spring TestContext 框架的作者)

您可以使用過濾器來自定義掃描。 在那里,您可以使用如下屬性擴展 ComponentScan Annotation:

@ComponentScan(
basePackages = {"com.my.package"}, 
useDefaultFilters = false,
includeFilters = {
    @Filter(type = FilterType.ASSIGNABLE_TYPE, value = {MyService.class, MyInjectedService.class})
})

您可以使用@Import注釋。 它比使用@ComponentScan注釋更具可讀性和更短。

import org.springframework.context.annotation.Import;

@Import(value = {MyService.class, MyInjectedService.class})
public class JUnitTest {
    @Autowired
    private MyService service;

    // ...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM