문제

Java에서 모의 ​​객체를 생성하는 데 가장 적합한 프레임워크는 무엇입니까?왜?각 프레임워크의 장단점은 무엇입니까?

도움이 되었습니까?

해결책

나는 사용하여 좋은 성공을 거두었습니다. 모키토.

JMock과 EasyMock에 대해 배우려고 시도했을 때 학습 곡선이 약간 가파르다는 것을 알았습니다(아마도 나만 그럴 수도 있지만).

나는 Mockito의 간단하고 깔끔한 구문 때문에 꽤 빨리 이해할 수 있었기 때문에 좋아했습니다.최소한의 구문은 일반적인 경우를 매우 잘 지원하도록 설계되었지만, 좀 더 복잡한 작업을 수행해야 할 경우에는 내가 원하는 것이 지원되고 이해하기 쉽다는 것을 알았습니다.

다음은 Mockito 홈페이지의 (요약된) 예입니다.

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...
}

여기에는 기록/재생 시나리오도 허용하는 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 클래스.

http://docs.codehaus.org/display/GROOVY/Groovy+Mocks

나는 모의를 사용하기 시작했습니다. EasyMock.이해하기는 쉽지만 재생 단계가 다소 짜증났습니다. 모키토 이를 제거하고 가독성이 주요 목표 중 하나인 것처럼 보이기 때문에 구문도 더 깔끔해졌습니다.대부분의 개발자는 기존 코드를 작성하는 것이 아니라 기존 코드를 읽고 유지하는 데 시간을 보내기 때문에 이것이 얼마나 중요한지는 아무리 강조해도 지나치지 않습니다.

또 다른 좋은 점은 EasyMock 클래스 확장을 사용하기 위해 기억하고 확인해야 하는 EasyMock과 달리 인터페이스와 구현 클래스가 동일한 방식으로 처리된다는 것입니다.

빠르게 살펴봤습니다 JMockit 최근에는 기능 목록이 꽤 포괄적이지만 결과 코드의 가독성과 더 많은 내용을 작성해야 한다는 점에서 그 대가가 크다고 생각합니다.

나에게 Mockito는 쓰기 쉽고 읽기 쉽고 대부분의 코드에 필요한 대부분의 상황을 처리하는 최적의 장소에 도달했습니다.사용 모키토 ~와 함께 파워모크 내 선택이 될 것입니다.

고려해야 할 한 가지 사항은 혼자 개발하거나 소규모 팀으로 개발하는 경우 선택하는 도구가 다양한 기술 수준의 개발자가 있는 대기업에는 적합하지 않을 수 있다는 것입니다.가독성, 사용 용이성 및 단순성은 후자의 경우 더 많은 고려가 필요합니다.많은 사람들이 결국 그것을 사용하지 않거나 테스트를 유지하지 않게 된다면 궁극적인 조롱 프레임워크를 얻는 것은 의미가 없습니다.

우리는 많이 사용하고 있습니다 EasyMock 그리고 직장에서 EasyMock Class Extension을 사용하고 있으며 매우 만족하고 있습니다.기본적으로 필요한 모든 것을 제공합니다.문서를 살펴보세요. EasyMock의 모든 기능을 보여주는 아주 좋은 예가 있습니다.

저는 초기에 JMock을 사용했습니다.나는 지난 프로젝트에서 Mockito를 사용해 보았고 마음에 들었습니다.더 간결하고 더 깔끔해졌습니다.PowerMock은 정적 코드 모의, 인스턴스 생성 모의, 최종 클래스 및 메소드 모의와 같이 Mockito에 없는 모든 요구 사항을 다룹니다.그래서 나는 내 일을 수행하는 데 필요한 모든 것을 가지고 있습니다.

나는 기대치를 설정할 수 있기 때문에 JMock을 좋아합니다.이는 일부 모의 라이브러리에서 메소드가 호출되었는지 확인하는 것과 완전히 다릅니다.JMock을 사용하면 매우 정교한 기대치를 작성할 수 있습니다.jmock을 참조하세요 속임수.

예, Mockito는 훌륭한 프레임워크입니다.같이 사용해요 햄크레스트 그리고 구글 가이던스 내 테스트를 설정합니다.

모의에 대한 가장 좋은 솔루션은 기계가 자동화된 사양 기반 테스트를 통해 모든 작업을 수행하도록 하는 것입니다.자바의 경우 다음을 참조하세요. 스칼라체크 그리고 환원 에 포함된 프레임워크 기능적 자바 도서관.자동화된 사양 기반 테스트 프레임워크를 사용하면 테스트 중인 메서드의 사양(true여야 하는 속성)을 제공하고 프레임워크는 테스트와 모의 개체를 자동으로 생성합니다.

예를 들어, 다음 속성은 Math.sqrt 메서드를 테스트하여 양수 n 제곱의 제곱근이 n과 같은지 확인합니다.

val propSqrt = forAll { (n: Int) => (n >= 0) ==> scala.Math.sqrt(n*n) == n }

당신이 전화할 때 propSqrt.check(), ScalaCheck는 수백 개의 정수를 생성하고 각각에 대한 속성을 확인하며, 극단적인 경우가 잘 처리되는지 자동으로 확인합니다.

ScalaCheck가 Scala로 작성되고 Scala 컴파일러가 필요하더라도 이를 사용하여 Java 코드를 쉽게 테스트할 수 있습니다.Functional Java의 Reductio 프레임워크는 동일한 개념을 순수 Java로 구현한 것입니다.

Mockito는 또한 스텁 메소드, 인수 일치(예: anyInt() 및 anyString()), 호출 수 확인(times(3), atLeastOnce(), never()) 옵션을 제공합니다. 그리고 더.

나는 또한 Mockito가 간단하고 깨끗하다.

내가 Mockito에 대해 마음에 들지 않는 한 가지는 당신이 정적 메서드를 스텁할 수 없습니다..

조금 다른 경우에는 다음을 사용할 수 있습니다. JRuby 그리고 모카 에서 결합된 JtestR 표현력이 풍부하고 간결한 Ruby로 Java 코드에 대한 테스트를 작성합니다.JtestR에는 몇 가지 유용한 조롱 예제가 있습니다. 여기.이 접근 방식의 한 가지 장점은 구체적인 클래스를 조롱하는 것이 매우 간단하다는 것입니다.

JMock을 통해 mock을 사용하기 시작했지만 결국 EasyMock을 사용하도록 전환했습니다.EasyMock은 바로 그랬습니다. --더 쉬웠고-- 더 자연스럽게 느껴지는 구문을 제공했습니다.그 이후로 전환하지 않았습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top