[java] Java를위한 최고의 모의 프레임 워크는 무엇입니까? [닫은]

Java에서 모의 ​​객체를 만들기위한 가장 좋은 프레임 워크는 무엇입니까? 왜? 각 프레임 워크의 장단점은 무엇입니까?



답변

Mockito를 사용하여 성공 했습니다 .

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는 강력한 클래스 MockForStubFor클래스를 포함하여 조롱 전선에서 훨씬 더 많은 것을 제공합니다 .

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


답변

EasyMock 과 함께 모의를 사용하기 시작했습니다 . 이해하기 쉽지만 재생 단계는 다소 성가신 일이었습니다. Mockito 는 이것을 제거하고 가독성이 주요 목표 중 하나 인 것처럼 보이기 때문에 구문이 더 깨끗합니다. 대부분의 개발자가 코드를 작성하지 않고 기존 코드를 읽고 유지 관리하는 데 시간을 소비하기 때문에 이것이 얼마나 중요한지 강조 할 수 없습니다.

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

최근 JMockit 에 대해 간략히 살펴 보았으며 기능의 세탁 목록이 매우 포괄적이지만이 가격은 결과 코드의 가독성이며 더 많이 작성해야한다고 생각합니다.

나를 위해 Mockito는 쓰기와 읽기가 쉬우 며 대부분의 코드가 요구하는 대부분의 상황을 처리합니다. 사용 Mockito를 함께 PowerMock 것은 내 선택이 될 것입니다.

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


답변

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