자바를 위한 최고의 모의 프레임워크는 무엇인가?
자바에서 모의 개체를 만드는 가장 좋은 프레임워크는 무엇인가? 그 이유는?각 틀의 장단점은 무엇인가?
모키토를 이용해 좋은 성과를 거두었다.
JMock과 EasyMock에 대해 배우려고 했을 때, 나는 학습 곡선이 약간 가파르다는 것을 알았다(그것이 나뿐일지도 모르지만).
나는 모키토를 좋아한다. 왜냐하면 모키토는 구문이 간단하고 깔끔해서 금방 이해할 수 있었기 때문이다.최소한의 구문은 일반적인 사례를 매우 잘 지원하기 위해 고안되었지만, 몇 번 더 복잡한 일을 해야 했지만, 내가 원하는 것이 지원되고 쉽게 이해할 수 있다는 것을 알았다.
모키토 홈페이지의 (요약) 예는 다음과 같다.
import static org.mockito.Mockito.*;
List mockedList = mock(List.class);
mockedList.clear();
verify(mockedList).clear();
그것보다 훨씬 더 간단해지지 않는다.
내가 생각할 수 있는 가장 큰 단점은 그것이 정적인 방법을 조롱하지 않는다는 것이다.
나는 파워모크의 창시자니까 당연히 그것을 추천해야 해! :-)
PowerMock은 정적 방법, 최종적인 방법, 심지어 사적인 방법을 조롱하는 능력으로 EasyMock과 Mockito를 모두 확장한다.EasyMock 지원은 완료되었지만 Mockito 플러그인은 조금 더 작업이 더 필요하다.우리는 JMock 지원도 추가할 계획이다.
PowerMock은 다른 프레임워크를 대체하기 위한 것이 아니라, 다른 프레임워크가 조롱을 허용하지 않는 까다로운 상황에서 사용될 수 있다.PowerMock은 정적 이니셜라이저와 생성자를 억제하는 것과 같은 다른 유용한 기능도 포함하고 있다.
JMockit 프로젝트 사이트에는 현재 모의 도구 키트에 대한 비교 정보가 많이 포함되어 있다.
특히 EasyMock, jMock, Mockito, Unitils Mock, PowerMock, 그리고 물론 JMockit을 망라하는 기능 비교 매트릭스를 확인해 보십시오.나는 가능한 한 정확하고 최신의 것을 유지하려고 노력한다.
나는 JMockit으로 성공을 거두고 있어.
꽤 새것이고, 그래서 약간 날것이고 문서화 되어 있지 않다.ASM을 활용해 동적으로 클래스 바이트코드를 재정의해 정적, 전용, 생성자, 정적 이니셜라이저 등 모든 방법을 조롱할 수 있다.예를 들면 다음과 같다.
import mockit.Mockit;
...
Mockit.redefineMethods(MyClassWithStaticInit.class,
MyReplacementClass.class);
...
class MyReplacementClass {
public void $init() {...} // replace default constructor
public static void $clinit{...} // replace static initializer
public static void myStatic{...} // replace static method
// etc...
}
기록/재생 시나리오도 허용하는 기대치 인터페이스를 갖추고 있다.
import mockit.Expectations;
import org.testng.annotations.Test;
public class ExpecationsTest {
private MyClass obj;
@Test
public void testFoo() {
new Expectations(true) {
MyClass c;
{
obj = c;
invokeReturning(c.getFoo("foo", false), "bas");
}
};
assert "bas".equals(obj.getFoo("foo", false));
Expectations.assertSatisfied();
}
public static class MyClass {
public String getFoo(String str, boolean bool) {
if (bool) {
return "foo";
} else {
return "bar";
}
}
}
}
단점은 자바 5/6이 필요하다는 것이다.
그루비를 이용한 테스트도 볼 수 있다.Groovy에서는 'as' 연산자를 사용하여 Java 인터페이스를 쉽게 조롱할 수 있다.
def request = [isUserInRole: { roleName -> roleName == "testRole"}] as HttpServletRequest
이러한 기본적인 기능과는 별도로 그루비는 강력한 사람들을 포함하여 조롱의 전선에 훨씬 더 많은 것을 제공한다.MockFor
그리고StubFor
반
http://docs.codehaus.org/display/GROOVY/Groovy+Mocks
나는 이지모크와 함께 모의실험을 시작했다.이해하기 쉽지만, 다시 보는 단계는 좀 짜증났어.모키토는 이것을 없애고, 가독성이 1차 목표 중 하나였던 것처럼 보이기 때문에 구문도 깔끔하다.대부분의 개발자들은 코드를 만들지 않고 기존 코드를 읽고 유지하는데 시간을 할애할 것이기 때문에 이것이 얼마나 중요한지 아무리 강조해도 지나치지 않다.
또 다른 좋은 점은 EasyMock에서 EasyMock Class Extension을 사용하기 위해 아직 기억하고 확인해야 하는 것과 달리 인터페이스와 구현 클래스가 동일한 방식으로 처리된다는 것이다.
최근에 JMockit을 잠깐 살펴봤는데, 특징의 세탁목록은 꽤 포괄적이지만, 이것의 가격은 결과 코드의 가독성이 있고, 더 많은 글을 써야 한다고 생각한다.
나에게 모키토는 쓰기 쉽고 읽기 쉬우며 대부분의 코드에서 필요로 하는 대부분의 상황을 처리하면서 좋은 점을 친다.파워모크와 함께 모키토를 사용하는 것이 내 선택일 것이다.
한 가지 고려해야 할 점은 만약 여러분이 스스로 개발하거나 소규모의 친밀한 팀이라면 선택할 수 있는 도구가 다양한 기술 수준의 개발자를 가진 대기업에 가장 적합한 도구가 아닐 수도 있다는 것이다.가독성, 사용 편의성 및 단순성은 후자의 경우에 더 많은 고려가 필요할 것이다.많은 사람들이 결국 그것을 사용하지 않거나 시험을 유지하지 않는다면 궁극적인 조롱의 틀을 얻는 것은 의미가 없다.
우리는 직장에서 EasyMock과 EasyMock Class Extension을 많이 사용하고 있고 그것에 꽤 만족하고 있다.그것은 기본적으로 당신이 필요한 모든 것을 준다.문서를 살펴보십시오. EasyMock의 모든 기능을 보여주는 매우 좋은 예가 있습니다.
나는 일찍 JMock을 사용했다.나는 지난 프로젝트에서 모키토를 시도해 보았고 그것을 좋아했다.더 간결하고, 더 깔끔하게.PowerMock은 정적 코드 조롱, 인스턴스 생성, 최종 클래스 및 방법 조롱 등 모키토에 없는 모든 니즈를 다룬다.그래서 나는 내 일을 수행하는 데 필요한 모든 것을 가지고 있다.
나는 JMock을 좋아한다. 왜냐하면 너는 기대치를 설정할 수 있기 때문이다.이는 일부 모의도서관에서 메서드가 발견됐는지 확인하는 것과는 전혀 다르다.JMock을 사용하면 매우 정교한 기대치를 작성할 수 있다.jmock 부정행위를 봐.
그렇다, 모키토는 훌륭한 틀이다.나는 그것을 햄크레스트와 구글 구이스와 함께 사용해 내 시험을 준비한다.
조롱에 대한 최선의 해결책은 자동화된 규격 기반 테스트로 모든 작업을 기계가 수행하도록 하는 것이다.Java의 경우, 기능 Java 라이브러리에 포함된 ScalaCheck 및 Reducedctio 프레임워크를 참조하십시오.자동화된 규격 기반 테스트 프레임워크를 사용하여 테스트 대상 방법의 사양(참이어야 하는 속성)을 제공하면 프레임워크는 모의 객체뿐만 아니라 테스트도 자동으로 생성한다.
예를 들어, 다음 속성은 math.sqrt 방법을 테스트하여 양수 n 제곱의 제곱근이 n과 동일한지 여부를 확인한다.
val propSqrt = forAll { (n: Int) => (n >= 0) ==> scala.Math.sqrt(n*n) == n }
전화할 때propSqrt.check()
, ScalaCheck는 수백의 정수를 생성하고 각 정수를 위해 당신의 속성을 점검하며, 또한 자동으로 가장자리 케이스가 잘 덮혀 있는지 확인한다.
스칼라체크는 스칼라로 쓰여져 있고 스칼라 컴파일러가 필요하지만 그것으로 자바 코드를 테스트하는 것은 쉽다.기능 자바의 Reducatedctio 프레임워크는 동일한 개념의 순수한 자바 구현이다.
또한 모키토는 스터빙 방법, 일치하는 인수(예: anyInt()와 anyString()), 호출 횟수 확인(3회), atLeastOnce(), never() 등의 옵션을 제공한다.
모키토가 단순하고 깨끗하다는 것도 알게 되었다.
내가 모키토의 한 가지 마음에 들지 않는 것은 정적인 방법을 터벅터벅 할 수 없다는 것이다.
조금 다른 것을 위해 JTestR에 결합된 JRuby와 Mocha를 사용하여 표현적이고 간결한 루비로 자바 코드에 대한 테스트를 작성할 수 있다.여기 JtestR과 함께 몇몇 유용한 조롱 사례들이 있다.이 접근방식의 한 가지 장점은 구체적인 수업을 조롱하는 것이 매우 간단하다는 것이다.
나는 JMock을 통해 mock을 사용하기 시작했지만, 결국 EasyMock을 사용하게 되었다.EasyMock은 그저 --좀 더 쉬운-- 그리고 좀 더 자연스럽게 느껴지는 구문을 제공했다.그 이후로 난 바뀌지 않았어.
참조URL: https://stackoverflow.com/questions/22697/whats-the-best-mock-framework-for-java
'IT이야기' 카테고리의 다른 글
테스트 라이브러리와 함께 적용되지 않는 SFC 스타일 (0) | 2022.04.23 |
---|---|
Vue: v-for의 입력 배열에서 입력 변경에 대응 (0) | 2022.04.22 |
Java에서 참조로 문자열을 전달하시겠습니까? (0) | 2022.04.22 |
Iterator를 스트림으로 변환하는 방법 (0) | 2022.04.22 |
Java가 서명되지 않은 int를 지원하지 않는 이유는? (0) | 2022.04.22 |