JMockit 간편 사용

JMockit 는 google code 위의 자바 유닛 테스트 의 mock 프레임 워 크 입 니 다.
JMockit 와 관련 된 요소 소개:
@Tested 와@Injectable     @Tested 대상 이 null 인지 여 부 를 판단 하 는 것 은 적절 한 구조 기 를 통 해 초기 화 되 며,@Injectable 의 인 스 턴 스 는@Tested 에 자동 으로 주 입 됩 니 다.@Mocked      @Mocked 수식 의 인 스 턴 스 는 인 스 턴 스 대응 클래스 의 모든 인 스 턴 스 를 mock 으로 제거 합 니 다(구조 방법 이 든 private 든 proctected 방법 이 든).Expectations      원 하 는 행 위 를 녹화 하 는 블록 은 일반적으로 Expectations 류 와 NonStrictExpectations 류 에 의 해 정의 되 고 Expectations 류 로 정 의 된 경우 mock 대상 이 실 행 될 때 Expectations 블록 에서 정 의 된 순서에 따라 순서대로 호출 할 수 있 으 며 다 중 호출 도 적 게 호출 할 수 없 으 며 Verifications 블록 을 생략 할 수 있 습 니 다.NonStrictExpectations 클래스 로 정 의 된 것 은 이러한 제한 이 없 기 때문에 검증 이 필요 하 다 면 Verifications 블록 을 추가 해 야 합 니 다.result 와 times 는 모두 내 정 된 구성원 변수 입 니 다.result 는 녹화 행위 의 반환 값 을 다시 정의 할 수 있 고 심지어 Delegate 를 통 해 행 위 를 다시 정의 할 수 있 으 며 times 는 녹화 행위 의 발생 횟수 를 기대 합 니 다.Expectations 에서 발생 하 는 호출 은 모두 mock 입 니 다.Deencapsulation      Mock 개인 방법 과 개인 속성 에 사용 합 니 다.간단 한 예제:
package com.zero.jmockit;

public class Utils {
	private static String URL_STRING = "http://www.sina.com.cn";

	private static void deal() {
		System.out.println("deal() " + URL_STRING);
	}

	public static String getObject(JMockitObject object, String str) {
		deal();
		System.out.println("getObject() ");
		return URL_STRING + str;
	}
}
package com.zero.jmockit;

public class UserService {
	public String getUserName(int id) {
		return "hello";
	}
}
package com.zero.jmockit;

import javax.annotation.Resource;

public class JMockitObject {

	@Resource
	private UserService userService;

	public void dealUser() {
		String name = userService.getUserName(1);
		System.out.println("userService.getUserName() : " + name);
		sys(name);
	}

	private void sys(String name) {
		System.out.println("sys() : " + name);
	}

	public String getString() {
		getObject(this, "/zero");
		return Utils.getObject(this, "/zero");
	}

	private void getObject(JMockitObject object, String str) {
		 System.out.println("--------");
	}

}
package com.zero.jmockit;

import org.junit.*;
import org.junit.runner.RunWith;

import mockit.*;
import mockit.integration.junit4.JMockit;

@RunWith(JMockit.class)
public final class JMockitTest {
	@Tested
	@Mocked
	private JMockitObject jMockitObject;

	@Injectable
	private UserService userService;

	@Test
	public void testDealUser() {
		new NonStrictExpectations() {//         
			{
				userService.getUserName(anyInt);//mock public  
				result = "zero";//     returns("zero");
				times = 1;

				Deencapsulation.invoke(jMockitObject, "sys", anyString);//mock private  
				// sys()    ,   result,         , result = null;      
				result = null;
			}
		};
		jMockitObject.dealUser();//  
	}

	@Test
	public void testSys() {
		Deencapsulation.invoke(jMockitObject, "sys", "Hello World!");//  private  
	}

	@Test
	public void testStaticField() {// mock       
		new NonStrictExpectations(Utils.class) {
			{
				Deencapsulation.setField(Utils.class, "URL_STRING",
						"www.baidu.com");
			}
		};
		//      :
		// new MockUp<Utils>() {
		// {
		// //         
		// Deencapsulation.setField(Utils.class, "URL_STRING",
		// "www.baidu.com");
		// }
		// };
		String str = Deencapsulation.getField(Utils.class, "URL_STRING");
		Assert.assertEquals("www.baidu.com", str);
	}

	@Test
	public void testStaticFunction() {// mock       
		new MockUp<Utils>() {
			@Mock
			private void deal() {//    MockUp         static     ,     Mock       ,    @Mock  
				System.out.println("mock deal() ");
			}
		};
		Deencapsulation.invoke(Utils.class, "deal");
	}

	@Test
	public void testGetString() {
		new NonStrictExpectations() {
			{
				Deencapsulation.invoke(jMockitObject, "getObject",
						withAny(JMockitObject.class), withAny(String.class));//     any     ,             ;
				// withAny(JMockitObject.class), anyString);   
			}
		};
		new NonStrictExpectations(Utils.class) {
			{
				Utils.getObject((JMockitObject) any, anyString);
				returns("zero");
			}
		};

		Assert.assertEquals("zero", jMockitObject.getString());
	}
}

좋은 웹페이지 즐겨찾기