답변:
JMock과 EasyMock에 대해 배우려고 할 때 학습 곡선이 약간 가파르다는 것을 알았습니다 (아마도 저뿐입니다).
나는 간단하고 깔끔한 구문으로 인해 Mockito를 좋아합니다. 최소한의 구문은 일반적인 경우를 매우 잘 지원하도록 설계되었지만 몇 번 더 복잡한 작업을 수행해야했지만 원하는 것을 지원하고 이해하기 쉽다는 것을 알았습니다.
다음은 Mockito 홈페이지의 요약입니다.
import static org.mockito.Mockito.*;
List mockedList = mock(List.class);
mockedList.clear();
verify(mockedList).clear();
그것보다 훨씬 간단하지 않습니다.
내가 생각할 수있는 유일한 단점은 정적 메서드를 조롱하지 않는다는 것입니다.
저는 PowerMock을 만든 사람이므로 반드시 추천해야합니다! :-)
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...
}
레코드 / 재생 시나리오를 허용하는 Expectations 인터페이스가 있습니다.
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";
}
}
}
}
단점은 Java 5/6이 필요하다는 것입니다.
Groovy를 사용한 테스트를 살펴볼 수도 있습니다. Groovy에서는 'as'연산자를 사용하여 Java 인터페이스를 쉽게 조롱 할 수 있습니다.
def request = [isUserInRole: { roleName -> roleName == "testRole"}] as HttpServletRequest
이 기본 기능 외에도 Groovy는 강력한 클래스 MockFor
와 StubFor
클래스를 포함하여 조롱 전선에서 훨씬 더 많은 것을 제공합니다 .
EasyMock 과 함께 모의를 사용하기 시작했습니다 . 이해하기 쉽지만 재생 단계는 다소 성가신 일이었습니다. Mockito 는 이것을 제거하고 가독성이 주요 목표 중 하나 인 것처럼 보이기 때문에 구문이 더 깨끗합니다. 대부분의 개발자가 코드를 작성하지 않고 기존 코드를 읽고 유지 관리하는 데 시간을 소비하기 때문에 이것이 얼마나 중요한지 강조 할 수 없습니다.
또 다른 좋은 점은 EasyMock 클래스 확장을 사용하기 위해 기억하고 확인해야하는 EasyMock과 달리 인터페이스와 구현 클래스가 동일한 방식으로 처리된다는 것입니다.
최근 JMockit 에 대해 간략히 살펴 보았으며 기능의 세탁 목록이 매우 포괄적이지만이 가격은 결과 코드의 가독성이며 더 많이 작성해야한다고 생각합니다.
나를 위해 Mockito는 쓰기와 읽기가 쉬우 며 대부분의 코드가 요구하는 대부분의 상황을 처리합니다. 사용 Mockito를 함께 PowerMock 것은 내 선택이 될 것입니다.
한 가지 고려해야 할 사항은 직접 개발하거나 작은 타이트한 팀에서 개발하는 경우 선택하는 도구가 다양한 기술 수준의 개발자가있는 대기업에 적합하지 않을 수 있다는 것입니다. 가독성, 사용 용이성 및 단순성은 후자의 경우 더 많은 고려가 필요합니다. 많은 사람들이 그것을 사용하지 않거나 테스트를 유지하지 않으면 궁극적 인 조롱 프레임 워크를 얻는 데 의미가 없습니다.
우리는 직장에서 EasyMock 및 EasyMock Class Extension을 많이 사용 하고 있으며 매우 만족합니다. 기본적으로 필요한 모든 것을 제공합니다. 설명서를 살펴보면 EasyMock의 모든 기능을 보여주는 아주 좋은 예가 있습니다.
예, Mockito는 훌륭한 프레임 워크입니다. 테스트를 설정하기 위해 hamcrest 및 Google guice 와 함께 사용합니다 .
조롱에 가장 적합한 솔루션은 기계가 자동 사양 기반 테스트로 모든 작업을 수행하도록하는 것입니다. Java의 경우 ScalaCheck 및 Reductio 프레임 워크에 포함 된 기능적 Java에 라이브러리에 . 자동화 된 사양 기반 테스트 프레임 워크를 사용하면 테스트중인 메서드의 사양 (사실 속성)을 제공하고 프레임 워크는 테스트를 수행하고 개체를 자동으로 생성합니다.
예를 들어 다음 속성은 Math.sqrt 메서드를 테스트하여 양수 n 제곱의 제곱근이 n과 같은지 확인합니다.
val propSqrt = forAll { (n: Int) => (n >= 0) ==> scala.Math.sqrt(n*n) == n }
전화 할 때 propSqrt.check()
하면 ScalaCheck는 수백 개의 정수를 생성하고 각각에 대해 속성을 확인하고 자동으로 가장자리가 잘 포함되어 있는지 확인합니다.
ScalaCheck는 Scala로 작성되었지만 Scala Compiler가 필요하지만 Java 코드를 쉽게 테스트 할 수 있습니다. Functional Java의 Reductio 프레임 워크는 동일한 개념의 순수한 Java 구현입니다.
Mockito는 호출의 수 확인, 인수 (anyInt 같은 ()와 anyString ())를 일치 스텁 방법의 옵션을 제공하지 않습니다 () 회 (3), atLeastOnce을 (결코 ()), 그리고 더 .
또한 Mockito가 간단하고 깨끗 하다는 것을 알았습니다 .
내가 Mockito에 대해 싫어하는 것 중 하나는 정적 메소드를 스텁 할 수 없다는 것 입니다.