머리말
이 기사에서는 단위 테스트에 SpringBoot+Junit+Mockito를 사용하는 방법을 소개하고 단위 테스트를 수행하기 위해 트랜잭션과 일치하는 클래스를 선택합니다.
단위 테스트 전 요구 사항을 이해하십시오
좋은 단일 테스트를 작성하려면 먼저 요구 사항을 이해해야합니다. 무엇을 해야할지 알면 테스트 방법을 알 수 있습니다. 그러나이 기사는 주로 Mockito의 사용에 대해 이야기하며 특정 요구에주의를 기울일 필요가 없습니다. 따라서이 섹션에서는 특정 요구 사항 설명을 생략합니다.
외부 종속성을 분리하십시오
CASE1. 테스트 된 클래스에서 @autowired 또는 @Resource 주석으로 주석을 달린 종속성 객체의 반환 값을 제어하는 방법
테스트 matchingserviceimpl.java 아래의 메소드의 매칭 (매칭 맨더 Buyorder, matchingorder sellorder)을 예로 들어
테스트 된 클래스 매칭 erviceimpl
public class matchingserviceimpl은 matchingservice {private static final logger log = loggerfactory.getLogger (matchingserviceimpl.class)를 구현합니다. @autowired private quoteservice quoteservice; ... Public MatchingResult 매칭 (MatchingOrder Buyorder, MatchingOrder Sellorder) {int currentPrice = QuoteserVice.GetCurrentPriceByProduct (BuyOrder.getProductCode ()); MatchingResult 결과 = New MatchingResult (); if (sellorder! = null && buyorder! = null && sellorder.getPrice () <= buyorder.getPrice ()) {...}}quoteservice.getCurrentPriceByProduct (buyorder.getProductCode ()); 현재 인용문을 얻기 위해 Redis에 액세스하려면 GetCurrentPriceByByProduct 메소드의 반환 값을 제어하려면 외부 종속성 QuotesVice를 조롱해야합니다. 다음과 같이 mockito를 사용하여 할 수 있습니다.
테스트 클래스 MatchingserviceimplTest
public class matchingserviceimpltest는 mockitobasedtest를 확장합니다 { / *** @Mock으로 표시된 객체 @injectMocks* / @Mock private quoteservice quoteservice로 표시된 개체에 자동으로 주입됩니다. /** * <fre> * 테스트 할 객체는 @injectMocks로 표시되며 @Mock으로 표시된 객체는 자동으로 주입됩니다. * 또 다른 점은 Spring 컨테이너를 통해 주입되지 않고 MatchingserviceImpl이 직접 새롭다는 것입니다 (Mockito 1.9 이후에 새로운 것이 아니라면 괜찮습니다). 여기서는 스프링 컨테이너 *에서 다른 종속성을 얻을 필요가 없기 때문에 데이터베이스, Redis, Zookeeper, MQ 및 그것에 의존하지 않으므로 직접 새롭게 새롭지 않으므로 개인 MatchingServiceimpl matchingservice = new MatchingserviceImpl (); @test public void testmatching_successwhencurrentpricebetwenbuypriceandsellprice () {matchingorder buyorder = new MatchingOrder (); buyorder.setPrice (1000); buyorder.setCount (23); MatchingOrder Sellorder = New MatchingOrder (); sellorder.setPrice (800); sellorder.setCount (20); // 메소드 스터브 (메서드 스터브) // 언제 (x) .ThenReturn (y) : 지정된 메소드가 mockito.when (quoteservice.getCurrentPriceByProduct (mockito.anystring ()). MatchingResult result = matchingservice.matching (buyorder, sellorder); org.junit.assert.assertequals (true, result.issuccess ()); // 매치 메이킹이 성공적인지 여부를 주장합니다. // 최신 인용문이 기대치를 충족하는지 여부를 주장합니다}CASE2. 기능 A가 테스트되면 테스트중인 클래스에서 함수 B의 반환 값을 제어하는 방법은 무엇입니까?
예를 들어, matchingserviceimpl에는 함수 startBuyProcess가 있는데, 이는 클래스의 다른 함수를 getTopSellorder 및 매칭과 같은 다른 함수라고합니다. 이 두 기능의 반환 값을 제어하는 방법은 무엇입니까?
여기서 해결해야 할 문제는 실제로 클래스 "부분 모의"테스트 클래스의 측정 된 방법 (예 : startBuyProcess)을 실제로 실행하는 방법이며, 다른 방법 (예 : getTopSellorder)은 쌓여 있고 실행되지 않음입니다.
테스트 된 클래스 매칭 erviceimpl
보호 된 void startBuyProcess (MatchingOrder Buyorder, Boolean WakeFormatching) {while (true) {// 상대방 매칭 서점 Topsellorder = getTopSellorder (buyorder.getProductCode ())의 최고의 가격. MatchingResult MatchingResult = 매칭 (Buyorder, Topsellorder); if (matchingresult.issuccess ()) {domatchingsuccess (Buyorder, topsellorder, matchingresult, matchingtype.buy); if (buyorder.getCount () <= 0) {break; }} else {if (waitformatching) {// 큐와 일치하도록 AddTomatchingBuy (Buyorder); } else {// 순서 sendcanclemsg (buyorder)를 취소합니다. } 부서지다; }}}}mockito.spy ()를 사용하면 "부분 모의"를 달성 할 수 있습니다.
테스트 클래스 matchingserviceimpltest.testStartBuyProcess_incaseofMatchingSuccess
/** * * * 성공적인 중매 후 STARTBUYPROCESS 방법의 처리가 기대치를 충족하는지, 즉 다음 판단 지점을 입력 한 후 동작을 테스트하는지 테스트합니다. MatchingResult, MatchingType.buy); * * if (buyorder.getCount () <= 0) { * break; *} *} * </ pre> * */ @test public void testStartBuyProcess_incaseofMatchingSuccess () {matchingorder buyorder = new MatchingOrder (); buyorder.setPrice (700); buyorder.setCount (23); // mockito.spy ()를 사용하여 Matchingservice matchingservice = mockito.spy (matchingservice)를 부분적으로 베개; MatchingResult FirstMatchingResult = New MatchingResult (); FirstMatchingResult.SetSuccess (true); FirstMatchingResult.SetTradeCount (20); MatchingResult SecondMatchingResult = New MatchingResult (); SecondMatchingResult.SetSuccess (false); // doreturn (x). (obj) .method ()가 방법을 쌓은 후, 방법을 쌓은 후 방법을 쌓은 후 프로그램은 이러한 메소드를 실행할 때 예상대로 지정된 값을 반환합니다. 쌓지 않은 방법은 실행됩니다. 실시간으로 실행됩니다. // 두 개의 Doreturns는 Matchingservice가 첫 번째로 호출되면 첫 번째 매칭 링 리트가 반환되었음을 의미하며, STARTBUYPROCESS에 WHITH 루프가 있기 때문에 두 번째 호출이 호출되면 2 차 호출이 호출되면 2 차 일정이 반환됩니다. 일치 방법은 여러 번 실행될 수 있습니다. mockito.doreturn (FirstMatchingResult) .doreturn (SecondMatchingResult). 시간 (Matchingservice) .matching (mockito.any (matchingorder.class), mockito.any (matchingorder.class)); MatchingOrder Sellorder = New MatchingOrder (); sellorder.setPrice (600); sellorder.setCount (20); // getTopSellorder 메소드를 쌓아 올리는 방법 mockito.doreturn (sellorder). // Jedis mockito.when (jedisclient.incrby (mockito.anystring (), mockito.anylong ()). // startBuyProcess는 테스트중인 함수입니다. 쌓지 않으면 Matchingservice.StartBuyProcess (Buyorder, True); // 후속 체크섬 어설 션은이 테스트의 목적이기도하는 domatchingsuccess 메소드의 동작을 테스트하는 것입니다 .// 확인을 사용하여 특정 클래스 메소드가 몇 번이나 실행되었는지 확인할 수 있습니까? 다음은 jedisclient.zremfirst가 mockito.verify (jedisclient, mockito.times (1)). zremfirst (mockito.anystring ()); org.junit.assert.assertequals (3, buyorder.getCount ()); org.junit.assert.assertequals (0, sellorder.getCount ()); } 스파이의 사용이 입증되었습니다. TestStartBuyProcess_incaseofMatchingSuccess의 단위 테스트의 "세분성"에 대해 이야기 해 봅시다.
TestStartBuyProcess_incaseofMatchingSuccess의 목적은 domatchingsuccess를 테스트하는 것입니다. 우리는 domatchingsuccess를 테스트하기 전에 이전 준비를 마치기 위해 매우 열심히 노력했습니다.
더 나은 관행은 Domatchingsuccess를 개별적으로 테스트하기 위해 새로운 테스트 방법을 시작하는 것이며 초점도 집중해야합니다. domatchingsuccess를 덮어 쓰인 후, StartBuyProcess는 실제로 자체 판단 지점을 다룰 수 있습니다. 적용 범위는 여전히 달성되며 테스트 코드를 유지하기가 더 쉽습니다. TestStartBuyProcess_incaseofMatchingSuccess는 너무 많은 책임으로 인한 변화에 의해 쉽게 영향을받습니다. 작은 것들 변화는 정상적인 기능에 영향을 줄 수 있습니다.
테스트 프레임 워크 Maven 의존성 소개
<pectionency> <groupId> junit </groupId> <artifactID> junit </artifactid> <bersion> 4.11 </version> <scope> test </scope> </dependency> <prection> <groupid> org.mockito </groupid> <artifactid> mockito-all </artifactid> <10.19 <10.19.19 <Scope> 테스트 </scope> </dependency> <pectionency> <groupId> org.springframework </groupid> <artifactid> 스프링 테스트 </artifactid> <bersion> 4.2.5. release </version> <cope> test </scope> </dependency>
SpringBoot+junit+mockito의 컨텍스트 구성
mockitobasedtest
@runwith (springJunit4classRunner.class) @SpringApplicationConfiguration (classs = testApplication.class) 공개 초록 클래스 mockitobasedtest {@before public void setup () 예외 {// test case class mockitoannotations에서 mockito의 주석에 의해 주석이있는 모든 mock 객체를 초기화합니다. }} // 기타 테스트 클래스는 mockitobasedtest를 상속합니다 위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.