boot spring test 文档_Spring、Spring Boot和TestNG测试指南 - @TestConfiguration

@TestConfiguration是Spring Boot Test提供的一种工具,用它我们可以在一般的@Configuration之外补充测试专门用的Bean或者自定义的配置。

需要特别注意,你应该使用一切办法避免在生产代码中自动扫描到@TestComponent。

如果你使用@SpringBootApplication启动测试或者生产代码,@TestComponent会自动被排除掉,如果不是则需要像@SpringBootApplication一样添加TypeExcludeFilter:

//...

@ComponentScan(excludeFilters = {

@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),

// ...})

public @interface SpringBootApplication

例子1:作为内部类

所以我们在测试代码上添加@SpringBootConfiguration,用@SpringBootTest(classes=...)或者在同package里添加@SpringBootConfiguration类都是可以的。

而且@TestConfiguration作为内部类的时候它是会被@SpringBootTest扫描掉的,这点和@Configuration一样。

@SpringBootTest

@SpringBootConfiguration

public class TestConfigurationTest extends AbstractTestNGSpringContextTests {

@Autowired

private Foo foo;

@Test

public void testPlusCount() throws Exception {

assertEquals(foo.getName(), "from test config");

}

@TestConfiguration

public class TestConfig {

@Bean

public Foo foo() {

return new Foo("from test config");

}

}

}

例子2:对@Configuration的补充和覆盖

补充额外的Bean

覆盖已存在的Bean

要特别注意第二点,@TestConfiguration能够直接覆盖已存在的Bean,这一点正常的@Configuration是做不到的。

我们先提供了一个正常的@Configuration(Config):

@Configuration

public class Config {

@Bean

public Foo foo() {

return new Foo("from config");

}

}

又提供了一个@TestConfiguration,在里面覆盖了foo Bean,并且提供了foo2 Bean(TestConfig):

@TestConfiguration

public class TestConfig {

// 这里不需要@Primary之类的机制,直接就能够覆盖

@Bean

public Foo foo() {

return new Foo("from test config");

}

@Bean

public Foo foo2() {

return new Foo("from test config2");

}

}

@SpringBootTest(classes = { Config.class, TestConfig.class })

public class TestConfigurationTest extends AbstractTestNGSpringContextTests {

@Qualifier("foo")

@Autowired

private Foo foo;

@Qualifier("foo2")

@Autowired

private Foo foo2;

@Test

public void testPlusCount() throws Exception {

assertEquals(foo.getName(), "from test config");

assertEquals(foo2.getName(), "from test config2");

}

}

再查看输出的日志,就会发现Auto Configuration已经关闭。

例子3:避免@TestConfiguration被扫描到

在上面的这个例子里的TestConfig是会被@ComponentScan扫描到的,如果要避免被扫描到,在本文开头已经提到过了。

先来看一下没有做任何过滤的情形,我们先提供了一个@SpringBootConfiguration(IncludeConfig):

@SpringBootConfiguration

@ComponentScan

public interface IncludeConfig {

}

@SpringBootTest(classes = IncludeConfig.class)

public class TestConfigIncludedTest extends AbstractTestNGSpringContextTests {

@Autowired(required = false)

private TestConfig testConfig;

@Test

public void testPlusCount() throws Exception {

assertNotNull(testConfig);

}

}

从这段代码可以看到TestConfig被加载了。

现在我们使用TypeExcludeFilter来过滤@TestConfiguration(ExcludeConfig1):

@SpringBootConfiguration

@ComponentScan(excludeFilters = {

@ComponentScan.Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class)

})

public interface ExcludeConfig1 {

}

@SpringBootTest(classes = ExcludeConfig1.class)

public class TestConfigExclude_1_Test extends AbstractTestNGSpringContextTests {

@Autowired(required = false)

private TestConfig testConfig;

@Test

public void test() throws Exception {

assertNull(testConfig);

}

}

还可以用@SpringBootApplication来排除TestConfig(ExcludeConfig2):

@SpringBootApplication

public interface ExcludeConfig2 {

}

@SpringBootTest(classes = ExcludeConfig2.class)

public class TestConfigExclude_2_Test extends AbstractTestNGSpringContextTests {

@Autowired(required = false)

private TestConfig testConfig;

@Test

public void testPlusCount() throws Exception {

assertNull(testConfig);

}

}

参考文档

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值