AssertThrows

Spring의 Test모듈에 들어있는 그다지 잘 알려져 있지 않은, 그러나 매우 유용한(유용하지 않은게 있긴하나? TestNG… 정도 :) 클래스 중에 AssertThrows이라는 것이 있다. AssertThrows는 보통 try/catch 블럭을 이용해서 만드는 익셉션이 발생하는 것을 확인하기 위한 테스트 코드를 스프링의 callback/template 스타일을 이용해서 깔끔하고 명료하게 작성할 수 있게 해준다.

일반적인 try/catch를 이용한 코드이다. try/catch 블록이 지저분 할 뿐더러, fail을 깜빡 빼먹어서 테스트를 잘못 작성하기도 쉬울 뿐더러, 익셉션 발생을 기대하는 코드로 자연스럽게 읽히지 않는다는 것이 단점이다.

try {
  // exception이 발생해야 하는 코드들...
  fail(“XXXException expected but…”);
} catch(XXXException e) { 
}

위의 경우는 XXXException이 발생하지 않거나, 다른 예외가 나면 테스트가 실패한다. 다른 종류의 예외의 경우 메소드 밖으로 던져지게 해서 테스트 실패가 아니라, 에러로 처리되는 것이 보기 좋지 않다면 Exception 타입으로 모두 catch한 후에 exception의 종류를 다시 한번 assert해주는 방법도 좋다.

catch(Exception e) {
  assertTrue(XXXException.class.isAssignableFrom(e));
}

이를 AssertThrows를 이용해서 작성하면 아래와 같다. 첫줄부터 명확하게 어떤 예외가 발생하는 것을 assert하는 코드라는 것이 자연스럽게 읽히고, 실패하는 경우 AssertFailureError가 발생하는 것이 확실하게 보장된다. 익명내부클래스(anonymous inner class)를 사용하지만 try/catch 블럭보다 보기도 깔끔하다.

new AssertThrows(XXXException.class) {
  public void test() {
    // exception이 발생해야 하는 코드들...
  }
}.runTest();

AssertThrows는 전형적인 callback/template 방식의 코드이다. test를 수행하는 코드를 hook method로 설정하고, try/catch와 예상되는 익셉션을 비교하고 적절한 에러메시지를 만들고, rootCause등을 세팅하는 것 등의 지저분한 일들을 내부의 템플릿 코드에서 모두 처리한다.

사용자는 이 클래스를 상속해서 test() 메소드를 오버라이드 해서 테스트코드를 작성하고, 원하는 익셉션을 생성자에 넣고 오브젝트를 만들어  runTest()  코드를 실행하면 된다.

Template Method 패턴을 이용한 것인데, 클래스 구조를 가진 패턴이라 매번 상속을 해야 하는 번거로움을 자바의 익명내부클래스를 이용해서 처리하니 거의 오브젝트 구조의 패턴만큼 간결하고 편하게 사용할 수 있다. 약간 목적은 다르지만 JUnit의 아답터 패턴이 적용된 pluggable behaviour 방식의 코드를 보는 듯 하다. JUnit extension에 아마 이와 비슷한 것이 있었던 기억이 있다(찾아보기 귀찮아서 .. 아마..)

 

스프링의 내부 테스트에서는 이 AssertThrows가 애용되고 있다. 프레임워크라는 특성상 예외를 확인해야 하는 로직들이 매우 많기 때문이다. 나또한 자주 사용한다.

사실 JUnit 4에서는 이렇게 익셉션 발생을 기대하는 테스트를 @Test(expected=…)으로 만들 수가 있다. 하지만 JUnit 3.8을 사용하거나 4.x를 사용하더라도 한 테스트 메소드 내에서 여러개의 assert과정의 일부로, 또는 반복적으로 예외를 체크할 경우는 @Test(expected=…)는 사용하기 힘들다. 그래서 나는 주로 JUnit 4를 사용하지만 AssertThrows를 애용한다. 무엇보다도 스프링의 스타일이 잘 드러나는 코드가 맘에 든다.

 

얼마전 Y군이 보라고 준 M잡지에 실린 테스트와 관련된 글을 하나 읽다가 AssertThrows에 관한 소개나 나오는 것을 보고 반가운 마음이 들었다. 예외가 발생해야 하는 상황에 대한 테스트 방법이라고 소개되어있다.

그런데 이어서 나오는 내용을 보고 조금 당황스러웠다. 단순히 예외 타입을 체크하는 것 이상의 테스트가 필요한 경우, 예를 들어 에러코드나 메시지까지도 확인해야 하는 경우는 AssertThrows를 쓸 수 없으니 그냥 구식 try/catch 방식의 테스트 코드를 작성하라는 것이다.

그리고 친절하게 예제가 나와 있다.

try {
  target = this.businessCalendar.
  getWorkingDateByTime(null, 11);
} catch (ApplicationException be) {
  assertEquals("유효하지 않은 에러코드입니다.", 
    BusinessCalendarMessageConstants.BIZ_CAL_DATE_NULL, be.getMessageCode());
} catch (Exception e) {
  fail("예외 타입 오류입니다.");
}

 

나는 이 테스트 코드에 대해서 두가지 불만이 있다.

첫째는 이 테스트의 의도가 불명확하다는 것이다. try 블럭에서 익셉션이 발생하지 않으면 테스트가 성공한다. 또한 테스트가 발생했는데 ApplicationException이고, 그 에러코드가 특저정 값인 경우도 테스트가 성공한다. 그 외에는 모두 실패한다. 이 테스트가 특정 에러코드를 리턴하는 익셉션을 체크하기 위한 테스트인지, 아니면 그 특별한 경우를 포함해서 정상적으로 동작하는 경우를 확인하기 위한 테스트인지 모호하다.

두번째는 스프링이 제공하는 편리한 기능의 AssertThrows를 사용했지만, 테스트 조건이 조금 바뀌었다고 바로 이전의 방식으로 돌아갔다는 점이다. AssertThrows와 같은 callback/template/pluggable behavior 스타일의 접근 방법은 스프링에서 매우 많이 사용되는 스타일이다. 비록 스프링이 익셉션의 특정한 조건을 부가적으로 제크하는 기능을 AssertThrows에는 만들어 놓지 않았지만, 그렇다고 해서 미리 만들어 놓은 기능이 없으니 그냥 이전에 하던 대로 하자는 것은 너무 수동적이고 무기력한 모습이 아닐까?

 

AssertLabledThrows

사실 나는 이미 오래전부터 익셉션의 메시지까지 확인하는, AssertThrows를 확장한 클래스를 만들어서 사용하고 있었다. 이름은 AssertLabledThrows이다. 단지, 비즈니스 로직의 예외를 체크하기 위해서 뿐만 아니라, 테스트하기 힘든 케이스(예를 들면 AOP의 특정 어드바이스가 실행되었는지를 확인하는 등의)를 위해서 특정 포인트에서 상태를 메시지로 만들어서 익셉션을 던지게 하고 AssertLabledThrows에서 특정 익셉션과 메시지를 모두 체크하도록 만들었다.

이를 이용해서 JavaConfig의 라이프사이클 메소드 호출이 되는 기능을 확인하기 위한 학습테스트로 만든 코드는 이렇다.

new AssertLabledThrows("initMethod") {
	public void test() throws Exception {
		new JavaConfigApplicationContext(AppConfigWithInitMethod.class);
	}
}.runTest();

@Configuration
static class AppConfigWithInitMethod {
	@Bean(initMethodName = "initMe")
	public BeanD myBeanD() {
		return new BeanD();
	}
}

static class BeanD {
	public void initMe() {
		throw new TestException("initMethod");
	}
}

 

특정 메소드에서 미리 지정된 익셉션을 던지게 하고 그 안에 구분이 가능한 에러메시지를 넣은 후, 이를 AssertLabledThrows 안에서 익셉션 타입과 메시지까지 함께 확인하는 것이다.

이 AssertLabeldThrows는 AssertThrows를 간단히 확장해서 만든 것이다. AssertThrows 클래스를 살펴보면 알 수 있지만, 적절한 템플릿과 로직을 담당하는 메소드는 모두 protected로 되어있어서, 서브 클래스에서 그 동작을 확장할 수 있도록 의도적으로 설계 되어있다. 익셉션 체크, 에러 메시지 작성, 전체 테스트 진행 템플릿 등이 모두 상세하게 독립된 메소드로 되어있어서 세세한 기능을 확장하기가 편리하다.

스프링의 많은 클래스들을 분석해보면 대부분 이런식으로 미의 확장을 위해서 효과적인 구조로 만들어져있다. 스프링을 그저 제공된 API를 기계적으로 사용하기 보다는, 이를 스프링의 개발 스타일을 따라서 그 확장포인트를 이용해서, 실제 개발 프로젝트의 요구사항에 맞게 적절히 확장해서 사용하는 것이 스프링을 제대로 사용하지를 알 수 있는 중요한 포인트이다.

 

그런데 위의 잡지에 소개된 코드를 보면서 내가 접근한 방법에 대해서도 불만이 생겼다. 나는 내가 필요한 특정한 방식의 익셉션 체크를 위해서 AssertThrows를 확장해서 사용하긴 했는데, 그 자체로 범용적인지 않으니, 만약 위의 예제처럼 코드를 비교한다거나, 다른 조건으로 익셉션에 대한 검증이 필요한 경우에 매번 새롭게 확장된 클래스를 구현해야 한다는 번거로움이 있다는 점이다.

 

AssertThrowsTemplate

그래서 이번에는 AssertThrows를 보다 다양한 조건을 가진 경우에도 손쉽게 적용할 수 있도록 좀 더 유연한 클래스로 확장하기로 했다. 이름하여 AssertThrowsTemplate. 스프링에 나오는 일반적인 xxxTemplate스타일로 만들어볼 생각이다.

다만, AssertThrows자체가 다른 Template류와는 다르게 template method pattern을 사용하고 있기 때문에 조금 한계가 있다. 그래도 구지 새롭게 만들기 보다는 가능한 방법을 사용해서 이를 확장하는 것이 낫다고 생각했다. 그래서 주말 저녁시간에 빈둥빈둥 만들어 본 AssertThrowsTemplate의 개발과정을 적어보려고 한다.

 

음.. 더 길어지면 Y군이 길게 쓴다고 또 씹을테니, 다음 포스팅으로 넘겨야 겠다.

Related posts:

  1. Spring 3.0 EL (Spel)을 이용한 AssertThrows 확장 (2)
  2. Spring 3.0 EL (Spel)을 이용한 AssertThrows 확장 (3)
  3. Spring Expressions(SpEL)를 이용한 Mockito Argument Matcher 만들기
  4. Spring 3.0 (59) 프로퍼티 파일 이용하기 – placeholder vs SpEL
  5. Spring 3.0 (58) Static Class를 XML없이 빈으로 등록하기
  6. Spring 3.0 (42) Spring Dependency Matrix 업데이트
  7. Spring 3.0 (55) getBean(Class) 등장
  8. Spring 3.0 (4) – Maven에서 Spring 3.0 최신버전 사용하기
  9. Spring 3.0 (46) Spring 3.0 M4 릴리스
  10. Spring 3.0 (28) R-669 Update
  11. Spring 3.0 (60) 클래스패스 리소스를 지정할 때 주의사항과 팁
  12. Spring 3.0 (54) 드디어 등장한 ConfigurationClassApplicationContext
  13. Spring 3.0 (25) Spring 3.0 빌드, 배포, 모듈과 라이브러리의 의존관계 분석 그 이후
  14. Spring 3.0.2 모듈/라이브러리 의존관계
  15. Spring 3.0 (35) Spring 3.0 Reference Document 공개

Facebook comments:

to “Spring 3.0 EL (Spel)을 이용한 AssertThrows 확장 (1)”

  1. I am so grateful for your article. Will read on…

  2. Hello, Neat post. There is a problem with your website in internet explorer, may check this… IE still is the marketplace chief and a large part of other people will omit your wonderful writing due to this problem.

  3. I found your weblog website on google and verify a few of your early posts. Continue to maintain up the very good operate. I simply additional up your RSS feed to my MSN News Reader. Looking for forward to studying extra from you afterward!…

  4. Really informative article post.Much thanks again. Really Great.

  5. Appreciate you sharing, great blog article.Much thanks again.

  6. Your style is very unique in comparison to other people I have read stuff from. I appreciate you for posting when you’ve got the opportunity, Guess I’ll just bookmark this web site.

  7. Really enjoyed this post.Really looking forward to read more. Will read on…

  8. Wow, amazing blog structure! How lengthy have you been running a blog
    for? you make blogging look easy. The entire glance of your web site is great, let alone the content material!

  9. Youre so cool! I dont suppose Ive learn something like this before. So nice to seek out any individual with some original ideas on this subject. realy thank you for starting this up. this website is something that is wanted on the internet, somebody with somewhat originality. helpful job for bringing something new to the internet!

  10. L’UFCM a constaté depuis quelques mois l’accroissement des tromperies à la « roqya ». Les témoignages de personnes victimes de ces pratiques se multiplient et présentent les mêmes caractéristiques : « Une personne vous appelle et vous propose une séance de « roqya » gratuite. Cette personne vous propose de rappeler un numéro prétendu gratuit, souvent un numéro commençant par 0 800… » Mais, dans les faits, cette prestation est loin d’être gratuite, puisque la conversation est facturée à vos frais et à votre insu. Au-delà de l’aspect juridique qui est traité à ce jour par le pôle juridique de l’UFCM[1], ce procédé soulève la problématique de sa conformité au Coran et à la Sunna. En effet, la « roqya » peut se définir comme une thérapie qui permet de soigner les actes de sorcellerie, de mauvais œil et également de se protéger contre ces derniers. Par conséquent, est-il possible de la pratiquer par téléphone et quelles sont les exigences édictées par le Coran et la Sunna ? Nous présenterons ainsi successivement les conditions liées au soignant (I), les exigences relatives à l’environnement où est réalisée la « roqya » (II). Nous aborderons ensuite la question de la gratuité de la prestation ou de sa contrepartie financière et enfin les conditions dans laquelle elle est réalisée (III). I- Les conditions liées au soignant Souvent la « roqya » est perçue comme une pratique dispensée par un tiers. Or, il est essentiel de rappeler et de souligner un fait important : la meilleure des « roqya » est celle que nous dispensons nous-mêmes à travers le « dhikr » et la récitation du Coran. Ainsi, pour se prémunir des maux liés au mauvais œil ou à la sorcellerie, il convient régulièrement de lire le Coran et faire des invocations notamment celles du matin et du coucher, de réciter régulièrement la sourate « La vache », de renouveler son intention, de placer la certitude dans son cœur, d’effectuer ses prières etc., et surtout de demander à Allah la meilleure des protections. Toutefois, dans certaines conditions, il est nécessaire de recourir à un soignant. C’est à ce stade qu’il convient d’être vigilant. Il ne suffit pas de se rendre auprès d’une personne qui se présente avec la qualité de cheikh ou d’imam pour accepter de lui confier cette pratique. Comme pour tout procédé et encore plus lorsque cela relève de considérations religieuses, il est important de bien choisir son soignant car ce dernier est tenu de posséder des qualités bien affirmées. La maîtrise du Coran et des traditions prophétiques en la matière est une condition sine qua none, mais insuffisante. La personne doit également avoir des notions de psychologie afin de déterminer la part de sorcellerie et celle de troubles psychologiques fréquents chez les patients. La personne doit posséder une bonne hygiène de vie, notamment spirituelle puisqu’il n’est pas inutile de rappeler que le succès de la « roqya » dépend de Dieu. Ces critères sont difficilement évaluables, surtout par une personne qui est affectée par un mal-être, quelle que soit sa source. C’est pourquoi les proches doivent accompagner la personne dans la recherche d’un soignant qualifié et reconnu comme tel par des référents religieux de la localité (imam, responsables associatifs, etc.). De manière générale, le soignant doit posséder des qualités déterminées que nous pouvons synthétiser de la manière suivante. Il doit : être en capacité de lire le Coran, croire avec certitude au Coran, être empreint de piété, connaître les pièges et les caractéristiques du diable et des djinns, connaître la méthode prophétique de la « roqya », disposer de connaissances de base en psychologie, avoir la conviction que le succès de sa thérapie dépend de Dieu. A l’exception de la première exigence, il semble difficile de vérifier les autres conditions dans le cadre d’un entretien téléphonique avec une personne que nous n’avons jamais rencontrée, même si elle se présente sous le titre de « cheikh » ou d’un imam. Par conséquent, ces conditions soulignent une première limite quant au recours à la « roqya » par téléphone. Par ailleurs, à l’instar de tout médecin, le soignant doit, avant de prodiguer des conseils ou une médication, procéder à une consultation. Ainsi, un environnement adéquat est indispensable pour la réalisation d’une « roqya ». Il est enfin inconcevable qu’un médecin puisse vous affirmer par téléphone connaître votre maladie et attester pouvoir vous guérir. Vous auriez plus que des doutes sur ce prétendu médecin. II- Un environnement propice et la réalisation d’une consultation préalable à la réalisation d’une « roqya » Il est intéressant de noter que, dans son ouvrage « Comment se protéger des djinns & satan », Wahîd ‘Abdussalâm Bâli évoque l’importance du climat pour réaliser une roqya[2]. Ainsi, il expose les points suivants : « 1. Préparer le climat adéquat en faisant par exemple sortir les images et les statues de la pièce où on va soigner le malade, pour permettre aux anges d’y entrer. 2. Débarrasser le sujet de tout ce qu’il peut porter sur lui comme talismans ou amulettes et les brûler. 3. Éteindre tout ce qui peut émettre le son de la musique et des chants. 4. Vider le lieu de tout ce qui comporte une infraction à la shari‘a à savoir, par exemple, la présence d’un homme qui porte de l’or ou une femme qui ne porte pas le voile légal – al-hijab. 5. Donner au malade et à sa famille une leçon de dogme de façon à ce que leurs cœurs ne soient pas attachés à un autre qu’Allah. 6. Leur faire savoir que la façon de soigner est différente de celle des sorciers et des charlatans et que le Coran recèle guérison et miséricorde, comme l’a informé Allah le Puissant et le Majestueux. 7. Diagnostiquer son cas : pour cela poser des questions au malade pour s’assurer de la présence de tous les symptômes (…) ». Or, dans les témoignages communiqués, l’interlocuteur qui se présente comme soignant ne pose aucune question aux personnes. Il débute ainsi la « roqya » directement par une récitation du Coran. En outre, il est intéressant de souligner que dans l’un des témoignages communiqués à l’UFCM, l’interlocuteur demandait à la personne de remplir successivement des verres de lait, d’huile, d’eau etc. et de les poser par la suite sur la table de la salle à manger. Au point que la personne s’est retrouvée avec une multitude de verres posés sur la table. Le comble est que la personne ignorait ce qu’elle devait en faire lorsqu’elle a pris conscience de la tromperie. Nous constatons par conséquent qu’une « roqya » ne peut être réalisée dans un environnement quelconque. En effet, une procédure de diagnostic est essentielle. Nous pouvons à titre d’exemple faire le parallèle avec un rendez-vous chez le médecin ; ce dernier ne peut vous prescrire une ordonnance sans au préalable vous avoir ausculté et interrogé sur les différents symptômes que vous ressentez physiquement. A défaut, au lieu de guérir vous allez aggraver vos maux. Cette attitude vigilante du médecin traitant doit se retrouver lorsque nous envisageons le recours à une « roqya ». Pour illustrer ce propos, nous citerons l’exemple de l’anthropologue, spécialiste de l’islam européen, Farid El Asri, chercheur associé au Centre Jacques Berque, qui nous rapporte une situation alarmante suite à une « roqya » : « Une jeune femme en Belgique (…) est morte suite à une tentative d’exorcisme. Pendant les séances, les fkihs (imams) utilisent normalement de l’eau « coranisée ». Pour cette jeune femme, prétendument stérile, les exorcistes ont carrément plongé son visage dans l’eau et quand elle tentait d’en sortir pour respirer, les guérisseurs estimaient qu’il s’agissait du jinn qui l’habitait et ils replongeaient son visage dans l’eau. Pendant le procès, la famille de la défunte s’est présentée comme musulmane et a accusé ces pratiques d’être extérieures à l’islam quand les guérisseurs estimaient qu’ils avaient simplement fait ce qu’ils pouvaient. Le fait de recourir trop systématiquement au fkih risque également de faire passer une crise d’épilepsie, par exemple, pour une crise de possession. »[3] Nous allons aborder enfin la dernière problématique, celle relative aux honoraires du soignant. III- Les honoraires du soignant Le Prophète, bénédictions et salut sur lui, « a agréé les Compagnons qui ont été payés pour la roqya ». Il est dès lors autorisé de rémunérer un soignant en contrepartie d’une prestation. Toutefois, cette rémunération doit être raisonnable et surtout clairement définie avant le traitement. En outre, nous ne pouvons que souligner et rappeler que, si la roqya est réalisée dans un cadre sérieux, il convient de procéder à toutes les déclarations administratives. Comme pour tout contrat, vous devez exiger un document écrit et le praticien doit préciser quels sont ses engagements exacts afin d’éviter tout litige postérieur. Malheureusement, tous les témoignages transmis à l’UFCM soulignent que l’interlocuteur insiste à plusieurs reprises sur la gratuité de la prestation. Or, dans les faits, cette dernière est payante puisque le coût de la communication est surtaxé. Ainsi, l’une des victimes qui nous a contacté, s’est retrouvée avec une facture téléphonique (hors forfait) de 1800 euros. Par conséquent, nous constatons que ces « roqyas » gratuites sont fondées sur la technique dite du « call-back » qui consiste à amener une personne à rappeler un numéro surtaxé, information qui lui est bien évidemment dissimulée. Une « roqya » peut être payante à condition de respecter un cadre prédéterminé, fondé sur l’information et la transparence des honoraires. En conclusion A la lumière des développements susvisés, l’UFCM appelle d’une part à une régulation du métier de la pratique de la « roqya », d’autre part, à la vigilance de chacun à ne pas céder à la tentation d’une « roqya » qui ne serait pas réalisée dans les conditions requises et qui pourrait produire des effets inverses. Au-delà du cadre spirituel ou juridique, les divers témoignages reçus et étudiés par l’UFCM ne peuvent pas nous laisser indifférents à la question suivante : pourquoi des personnes sont-elles amenées à accepter aussi facilement une « roqya » par téléphone ? Est-ce la gratuité qui a déterminé leur choix ? Certes le mal-être produit par cette société est de plus en plus grand. Nous vivons une époque où les êtres sont de plus en plus coupés des signes de Dieu et vivent un rythme de vie effréné. Ces affaires sont révélatrices des maux les plus profonds qui touchent la communauté musulmane. Par ailleurs, comme l’ensemble des rites islamiques (hajj, halal, pompes funèbres) censés nous rappeler les limites qui déterminent la voie vers Dieu, nous constatons que leur marchandisation trahit de plus en plus leur vocation première. Suffit-il qu’un interlocuteur se présente à nous comme un « cheikh » ou un imam et qu’il nous propose une « roqya » gratuite pour l’accepter aussitôt Ne devrions-nous pas tous nous interroger sur le fait qu’il y ait des musulmanes et des musulmans aussi isolés et aussi ignorants de leur propre religion pour être trompés aussi facilement ? Sommes-nous devenus si dépendants des Hommes que nous en oublions de nous adresser directement à Dieu pour solutionner nos malaises ? Autant de questions que chacun d’entre nous a la responsabilité de se poser. En effet, aucun de nous ou de nos proches ne sont à l’abri d’une telle tromperie. Il convient enfin de rappeler que la « roqya » est un remède précis et qu’elle ne peut se faire que sous certaines conditions et surtout qu’elle demeure l’exception à la règle, qui est de toujours s’adresser directement à Dieu. Avant de recourir à une « roqya », il convient de faire une introspection sur ses propres pratiques cultuelles et de revenir.

  11. I am also writing to make you know what a fabulous experience my friend’s daughter gained visiting your blog. She figured out a lot of things, with the inclusion of how it is like to have an awesome helping character to have a number of people really easily fully grasp chosen complicated subject areas. You actually did more than visitors’ desires. I appreciate you for producing the valuable, dependable, educational not to mention unique thoughts on that topic to Evelyn.

  12. Wow, great blog post.Really looking forward to read more. Want more.

  13. I really enjoy the blog post. Fantastic.

  14. Whats up! I simply want to give an enormous thumbs up for the great data you have got right here on this post. I will likely be coming back to your blog for extra soon.

  15. I’m not sure why but this website is loading very slow for me. Is anyone else having this problem or is it a problem on my end? I’ll check back later and see if the problem still exists.

  16. Thanks-a-mundo for the blog post.Thanks Again. Will read on…

  17. Oh my goodness! Incredible article dude! Thank you so much, However I am encountering problems with your RSS. I don’t understand why I can’t join it. Is there anybody else getting the same RSS issues? Anyone that knows the answer can you kindly respond? Thanx!!

  18. Good information. Lucky me I found your website by accident (stumbleupon). I’ve saved it for later!

  19. My wife and i were really thrilled that John could do his studies from your precious recommendations he gained in your weblog. It is now and again perplexing to simply find yourself offering points that most people might have been making money from. So we recognize we need the blog owner to thank for that. All the explanations you have made, the straightforward web site menu, the friendships you give support to create – it’s all astounding, and it is making our son in addition to the family imagine that this article is interesting, which is certainly truly important. Many thanks for the whole lot!

  20. You can definitely see your expertise within the paintings you write. The sector hopes for more passionate writers like you who are not afraid to say how they believe. Always follow your heart.

  21. I wanted to thank you for this fantastic read!! I certainly loved every bit of it. I’ve got you book marked to look at new stuff you post…

  22. Good day! I simply would like to give an enormous thumbs up for the good information you may have here on this post. I will be coming again to your blog for more soon.

  23. Hi there! This blog post couldn’t be written any better! Going through this post reminds me of my previous roommate! He always kept preaching about this. I most certainly will send this information to him. Pretty sure he will have a very good read. Thank you for sharing!

  24. I do love the manner in which you have presented this specific matter plus it does give me some fodder for consideration. Nevertheless, because of everything that I have seen, I only trust as other remarks stack on that folks stay on point and not get started upon a soap box involving the news du jour. All the same, thank you for this exceptional piece and although I do not go along with this in totality, I regard the point of view.

  25. Enjoyed every bit of your blog.Much thanks again. Keep writing.

  26. whoah this blog is excellent i like studying your articles.

    Keep up the good work! You recognize, lots of people are
    searching round for this info, you can aid them greatly.

  27. This excellent website really has all the information and facts I needed concerning this subject and didn’t know who to ask.

  28. My brother suggested I might like this website. He was totally right. This post actually made my day. You can not imagine simply how much time I had spent for this information! Thanks!

  29. You are a very intelligent individual!

  30. Wow, incredible blog format! How long have you ever been blogging for? you make running a blog glance easy. The overall glance of your site is excellent, let alone the content material!

  31. Hi there, just became aware of your blog through Google, and found that it is truly informative. I’m going to watch out for brussels. I will appreciate if you continue this in future. Many people will be benefited from your writing. Cheers!

  32. I really liked your blog article.Much thanks again. Great.

  33. I have been reading out a few of your articles and i can claim pretty good stuff. I will make sure to bookmark your blog.

  34. I truly love your blog.. Very nice colors & theme. Did you develop this amazing site yourself? Please reply back as I’m wanting to create my own personal site and would like to learn where you got this from or just what the theme is called. Thank you.

  35. What’s up every one, here every one is sharing such experience, so it’s
    good to read this webpage, and I used to pay a quick visit this webpage everyday.

  36. Join for free to exchange clothes, toys, accessories, librtos and video games in your city. https://swaphouse.net/

  37. The next time I learn a blog, I hope that it doesnt disappoint me as much as this one. I imply, I know it was my option to read, but I actually thought youd have one thing interesting to say. All I hear is a bunch of whining about something that you could fix in the event you werent too busy on the lookout for attention.

  38. Thank you so much for providing individuals with remarkably superb possiblity to read from this blog. It is often so superb and also packed with a great time for me personally and my office peers to visit your blog at minimum three times in a week to study the new stuff you will have. And indeed, I am at all times happy for the superb creative concepts you serve. Some 2 tips on this page are in reality the simplest we have ever had.

  39. Thanks again for the blog.Really thank you! Cool.

  40. Say, you got a nice blog article.Thanks Again. Cool.

Leave a Reply

(required)

(required)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

© 2017 Toby's Epril Suffusion theme by Sayontan Sinha