返回首页 | 金赞娱乐场

合作共赢、快速高效、优质的网站建设提供商

更多精品源码-尽在织梦模板-www.moke8.com

[编码]Testing Spring Boot with TestNG

时间:2017-07-21 编辑:admin

[编码]Testing Spring Boot with TestNG Chapter 1: 基本用法

本项目均可以使用mvn clean test方式跑单元测试,特别需要注意,只有文件名是*Test.java才会被执行,一定要注意这一点哦。

Section 1: TestNG

先认识一下TestNG,这里有一个类,里面有两个方法,一个是给计数器+1,一个是获取当前计数器的值:

public class Foo {
 private int count = 0;
 public void plusCount() {
 this.count++;
 public int getCount() {
 return count;
}

然后我们针对它有一个作为UT:

public class FooTest {
 @Test
 public void testPlusCount() {
 Foo foo = new Foo();
 assertEquals(foo.getCount(), 0);
 foo.plusCount();
 assertEquals(foo.getCount(), 1);
}

看上去挺简单不是?记住,所谓的测试其实就是给定输入、执行一些方法,assert结果是否符合预期的过程。

Section 2: Spring Boot Testing with TestNG

前面我们使用了TestNG做了最简单的UT,那么在Spring Boot项目里,如何针对Bean做测试呢?其实你也可以像前面一样测,但是如果你需要利用Spring提供的依赖注入特性来做测试,该怎么做?

为了说明Spring Boot下的TestNG测试,我们先提供了及其实现:

public interface FooService {
 void plusCount();
 int getCount();
@Component
public class FooServiceImpl implements FooService {
 private int count = 0;
 @Override
 public void plusCount() {
 this.count++;
 @Override
 public int getCount() {
 return count;
}

注意在这里我们把注册为了一个Bean。

方式1:使用@SpringBootApplication加载Bean

源代码见:

@SpringBootTest
@SpringBootApplication(scanBasePackageClasses = FooService.class)
public class FooBoot1Test extends AbstractTestNGSpringContextTests {
 @Autowired
 private FooService foo;
 @Test
 public void testPlusCount() throws Exception {
 assertEquals(foo.getCount(), 0);
 foo.plusCount();
 assertEquals(foo.getCount(), 1);
}

为了能够使用TestNG测试Spring代码,必须将测试类继承。

在这里,我们把测试类变成了,它使用了自动扫描机制scanBasePackageClasses来加载Bean。并且标注了来说明这是一个Spring Boot Test。

的内在机制是:在没有内嵌,且没有指定@SpringBootTest(classes=...)的时候,会去尝试查找,而就是。需要注意的是,同一个JVM中只能有一个,如果有多个就启动不起来了。

相比多了些什么呢?我们看看其源码就会知道:

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
 @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
 @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
 // ...
}

多了的配置,以及,知道这一点很有用,因为如果你想限定UT所加载的Bean范围,就可以利用这点。

事实上你在运行本Section的例子的时候会发现有的例子里会打印出下面这条日志,有的则不会:

2017-07-07 13:44:37.537 INFO 14399 --- [ main] m.c.a.AutoConfigurationEnableLogger : Auto Configuration Enabled

带着这个问题接着往后看吧。

方式2:使用内嵌@Configuration加载Bean

源代码见:

@SpringBootTest
public class FooBoot2Test extends AbstractTestNGSpringContextTests {
 @Autowired
 private FooService foo;
 @Test
 public void testPlusCount() throws Exception {
 assertEquals(foo.getCount(), 0);
 foo.plusCount();
 assertEquals(foo.getCount(), 1);
 @Configuration
 public static class FooConfiguration {
 @Bean
 public FooService foo() {
 return new FooServiceImpl();
}

在这里我们在测试类里内嵌了,和方式1不同的是,方式2没有使用自动扫描机制,而是使用内嵌注册了Bean。

方式3:使用外部@Configuration加载Bean

源代码见和:

@SpringBootTest(classes = FooConfiguration.class)
public class FooBoot3Test extends AbstractTestNGSpringContextTests {
 @Autowired
 private FooService foo;
 @Test
 public void testPlusCount() throws Exception {
 assertEquals(foo.getCount(), 0);
 foo.plusCount();
 assertEquals(foo.getCount(), 1);
@Configuration
public class FooConfiguration {
 @Bean
 public FooService foo() {
 return new FooServiceImpl();
}

这个方式和方式2差不多,只不过将放到了外部。

方式4:使用外部@SpringBootApplication加载Bean

源代码见和:

@SpringBootTest(classes = BootConfiguration.class)
public class FooBoot4Test extends AbstractTestNGSpringContextTests {
 @Autowired
 private FooService foo;
 @Test
 public void testPlusCount() throws Exception {
 assertEquals(foo.getCount(), 0);
 foo.plusCount();
 assertEquals(foo.getCount(), 1);
@SpringBootApplication(scanBasePackageClasses = FooService.class)
public interface BootConfiguration {
}
方式5:使用外部@SpringBootConfiguration加载Bean

源代码见和:

@SpringBootTest(classes = BootConfiguration.class)
public class FooBoot5Test extends AbstractTestNGSpringContextTests {
 @Autowired
 private FooService foo;
 @Test
 public void testPlusCount() throws Exception {
 assertEquals(foo.getCount(), 0);
 foo.plusCount();
 assertEquals(foo.getCount(), 1);
@SpringBootConfiguration
@ComponentScan(
 basePackageClasses = FooService.class,
 excludeFilters = {
 @ComponentScan.Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
 @ComponentScan.Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class)
public interface BootConfiguration {
}
方式6:关闭Auto Configuration

源代码见

@SpringBootTest
@OverrideAutoConfiguration(enabled = false)
@SpringBootApplication(scanBasePackageClasses = FooService.class)
public class FooBoot6Test extends AbstractTestNGSpringContextTests {
 @Autowired
 private FooService foo;
 @Test
 public void testPlusCount() throws Exception {
 assertEquals(foo.getCount(), 0);
 foo.plusCount();
 assertEquals(foo.getCount(), 1);
}

在这里我们使用了关闭了Auto Configuration。

Section 3: Spring Testing with TestNG

这个部分我们会讲Old School测试Spring项目的方式,即不使用Spring Boot的脚手架来做测试。

方式1:使用SpringBootTestContextBootstrapper

源代码见:

@BootstrapWith(SpringBootTestContextBootstrapper.class)
@ContextConfiguration(classes = FooServiceImpl.class)
public class FooNoBoot1Test extends AbstractTestNGSpringContextTests {
 @Autowired
 private FooService foo;
 @Test
 public void testPlusCount() throws Exception {
 assertEquals(foo.getCount(), 0);
 foo.plusCount();
 assertEquals(foo.getCount(), 1);
}

在这里我们使用了,其实使用的就是,所以我们这里模拟了的行为。

同时我们也使用了来加载Bean。

方式2:传统方式

源代码见:

@ContextConfiguration(classes = FooServiceImpl.class)
public class FooNoBoot2Test extends AbstractTestNGSpringContextTests {
 @Autowired
 private FooService foo;
 @Test
 public void testPlusCount() throws Exception {
 assertEquals(foo.getCount(), 0);
 foo.plusCount();
 assertEquals(foo.getCount(), 1);
}

这是我们目前为止看到的最少的测试代码,和方式1不同,在这个例子里实际上使用的是。

PS. 对比一下和方式1的日志输出,看看有什么不一样。


浏览:

网站建设

流程

    网站建设流程