国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Spring、Spring Boot和TestNG測(cè)試指南 - 測(cè)試AOP

changfeng1050 / 3016人閱讀

摘要:首先先來看我們事先定義的以及。可以看到會(huì)修改方法的返回值,使其返回。例子測(cè)試的行為最簡(jiǎn)單的測(cè)試方法就是直接調(diào)用,看看它是否使用返回。先看這段代碼這些是利用提供的和來判斷是否被代理了的實(shí)現(xiàn)是通過動(dòng)態(tài)代理來做的。

Github地址

Spring提供了一套AOP工具,但是當(dāng)你把各種Aspect寫完之后,如何確定這些Aspect都正確的應(yīng)用到目標(biāo)Bean上了呢?本章將舉例說明如何對(duì)Spring AOP做測(cè)試。

首先先來看我們事先定義的Bean以及Aspect。

FooServiceImpl:

@Component
public class FooServiceImpl implements FooService {

  private int count;

  @Override
  public int incrementAndGet() {
    count++;
    return count;
  }

}

FooAspect:

@Component
@Aspect
public class FooAspect {

  @Pointcut("execution(* me.chanjar.aop.service.FooServiceImpl.incrementAndGet())")
  public void pointcut() {
  }

  @Around("pointcut()")
  public int changeIncrementAndGet(ProceedingJoinPoint pjp) {
    return 0;
  }

}

可以看到FooAspect會(huì)修改FooServiceImpl.incrementAndGet方法的返回值,使其返回0。

例子1:測(cè)試FooService的行為

最簡(jiǎn)單的測(cè)試方法就是直接調(diào)用FooServiceImpl.incrementAndGet,看看它是否使用返回0。

SpringAop_1_Test:

@ContextConfiguration(classes = { SpringAopTest.class, AopConfig.class })
public class SpringAop_1_Test extends AbstractTestNGSpringContextTests {

  @Autowired
  private FooService fooService;

  @Test
  public void testFooService() {

    assertNotEquals(fooService.getClass(), FooServiceImpl.class);

    assertTrue(AopUtils.isAopProxy(fooService));
    assertTrue(AopUtils.isCglibProxy(fooService));

    assertEquals(AopProxyUtils.ultimateTargetClass(fooService), FooServiceImpl.class);

    assertEquals(AopTestUtils.getTargetObject(fooService).getClass(), FooServiceImpl.class);
    assertEquals(AopTestUtils.getUltimateTargetObject(fooService).getClass(), FooServiceImpl.class);

    assertEquals(fooService.incrementAndGet(), 0);
    assertEquals(fooService.incrementAndGet(), 0);

  }

}

先看這段代碼:

assertNotEquals(fooService.getClass(), FooServiceImpl.class);

assertTrue(AopUtils.isAopProxy(fooService));
assertTrue(AopUtils.isCglibProxy(fooService));

assertEquals(AopProxyUtils.ultimateTargetClass(fooService), FooServiceImpl.class);

assertEquals(AopTestUtils.getTargetObject(fooService).getClass(), FooServiceImpl.class);
assertEquals(AopTestUtils.getUltimateTargetObject(fooService).getClass(), FooServiceImpl.class);

這些是利用Spring提供的AopUtils、AopTestUtils和AopProxyUtils來判斷FooServiceImpl Bean是否被代理了(Spring AOP的實(shí)現(xiàn)是通過動(dòng)態(tài)代理來做的)。

但是證明FooServiceImpl Bean被代理并不意味著FooAspect生效了(假設(shè)此時(shí)有多個(gè)@Aspect),那么我們還需要驗(yàn)證FooServiceImpl.incrementAndGet的行為:

assertEquals(fooService.incrementAndGet(), 0);
assertEquals(fooService.incrementAndGet(), 0);
例子2:測(cè)試FooAspect的行為

但是總有一些時(shí)候我們是無法通過例子1的方法來測(cè)試Bean是否被正確的advised的:

advised方法沒有返回值

Aspect不會(huì)修改advised方法的返回值(比如:做日志)

那么這個(gè)時(shí)候怎么測(cè)試呢?此時(shí)我們就需要用到Mockito的Spy方法結(jié)合Spring Testing工具來測(cè)試。

SpringAop_2_Test:

@ContextConfiguration(classes = { SpringAop_2_Test.class, AopConfig.class })
@TestExecutionListeners(listeners = MockitoTestExecutionListener.class)
public class SpringAop_2_Test extends AbstractTestNGSpringContextTests {

  @SpyBean
  private FooAspect fooAspect;

  @Autowired
  private FooService fooService;

  @Test
  public void testFooService() {

    // ...
    verify(fooAspect, times(2)).changeIncrementAndGet(any());

  }

}

這段代碼和例子1有三點(diǎn)區(qū)別:

啟用了MockitoTestExecutionListener,這樣能夠開啟Mockito的支持(回顧一下Chapter 3: 使用Mockito)

@SpyBean private FooAspect fooAspect,這樣能夠聲明一個(gè)被Mockito.spy過的Bean

verify(fooAspect, times(2)).changeIncrementAndGet(any()),使用Mockito測(cè)試FooAspect.changeIncrementAndGet是否被調(diào)用了兩次

上面的測(cè)試代碼測(cè)試的是FooAspect的行為,而不是FooServiceImpl的行為,這種測(cè)試方法更為通用。

例子3:Spring Boot的例子

上面兩個(gè)例子使用的是Spring Testing工具,下面舉例Spring Boot Testing工具如何測(cè)AOP(其實(shí)大同小異):

SpringBootAopTest:

@SpringBootTest(classes = { SpringBootAopTest.class, AopConfig.class })
@TestExecutionListeners(listeners = MockitoTestExecutionListener.class)
public class SpringBootAopTest extends AbstractTestNGSpringContextTests {

  @SpyBean
  private FooAspect fooAspect;

  @Autowired
  private FooService fooService;

  @Test
  public void testFooService() {

    // ...
    verify(fooAspect, times(2)).changeIncrementAndGet(any());

  }

}
參考文檔

Aspect Oriented Programming with Spring

AopUtils

AopTestUtils

AopProxyUtils

spring源碼EnableAspectJAutoProxyTests

spring源碼AbstractAspectJAdvisorFactoryTests

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/70359.html

相關(guān)文章

  • SpringSpring BootTestNG測(cè)試指南 - 測(cè)試Spring MVC

    摘要:地址提供了,能夠很方便的來測(cè)試。同時(shí)也提供了更進(jìn)一步簡(jiǎn)化了測(cè)試需要的配置工作。本章節(jié)將分別舉例說明在不使用和使用下如何對(duì)進(jìn)行測(cè)試。例子測(cè)試的關(guān)鍵是使用對(duì)象,利用它我們能夠在不需啟動(dòng)容器的情況下測(cè)試的行為。 Github地址 Spring Testing Framework提供了Spring MVC Test Framework,能夠很方便的來測(cè)試Controller。同時(shí)Spring...

    andong777 評(píng)論0 收藏0
  • SpringSpring BootTestNG測(cè)試指南 - @OverrideAutoConfi

    摘要:因?yàn)橹挥羞@樣才能夠在測(cè)試環(huán)境下發(fā)現(xiàn)生產(chǎn)環(huán)境的問題,也避免出現(xiàn)一些因?yàn)榕渲貌煌瑢?dǎo)致的奇怪問題。而方法則能夠不改變?cè)信渲貌惶峁┬碌呐渲玫那闆r下,就能夠關(guān)閉。 Github地址 在Chapter 1: 基本用法 - 使用Spring Boot Testing工具里提到: 除了單元測(cè)試(不需要初始化ApplicationContext的測(cè)試)外,盡量將測(cè)試配置和生產(chǎn)配置保持一致。比如如果生產(chǎn)...

    elisa.yang 評(píng)論0 收藏0
  • SpringSpring BootTestNG測(cè)試指南 - @JsonTest

    摘要:地址是提供的方便測(cè)試序列化反序列化的測(cè)試工具,在的文檔中有一些介紹。例子簡(jiǎn)單例子源代碼見使用通包下的文件測(cè)試結(jié)果是否正確或者使用基于的校驗(yàn)例子測(cè)試可以用來測(cè)試。這個(gè)例子里使用了自定義的測(cè)試代碼例子使用事實(shí)上也可以配合一起使用。 Github地址 @JsonTest是Spring Boot提供的方便測(cè)試JSON序列化反序列化的測(cè)試工具,在Spring Boot的文檔中有一些介紹。 需要注...

    Hegel_Gu 評(píng)論0 收藏0
  • SpringSpring BootTestNG測(cè)試指南 - 使用Spring Testing工具

    摘要:源代碼見需要注意的是,如果是專供某個(gè)測(cè)試類使用的話,把它放到外部并不是一個(gè)好主意,因?yàn)樗锌赡軙?huì)被掃描到,從而產(chǎn)生一些奇怪的問題。 Github地址 既然我們現(xiàn)在開發(fā)的是一個(gè)Spring項(xiàng)目,那么肯定會(huì)用到Spring Framework的各種特性,這些特性實(shí)在是太好用了,它能夠大大提高我們的開發(fā)效率。那么自然而然,你會(huì)想在測(cè)試代碼里也能夠利用Spring Framework提供的特...

    Maxiye 評(píng)論0 收藏0
  • SpringSpring BootTestNG測(cè)試指南 - 共享測(cè)試配置

    摘要:地址在使用工具中提到在測(cè)試代碼之間盡量做到配置共用。本章將列舉幾種共享測(cè)試配置的方法我們可以將測(cè)試配置放在一個(gè)里,然后在測(cè)試或中引用它。也可以利用的及自定義機(jī)制,提供自己的用在測(cè)試配置上。 Github地址 在使用Spring Boot Testing工具中提到: 在測(cè)試代碼之間盡量做到配置共用。...能夠有效利用Spring TestContext Framework的緩存機(jī)制,Ap...

    CHENGKANG 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<