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


347

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

답변:


315

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

JMock과 EasyMock에 대해 배우려고 할 때 학습 곡선이 약간 가파르다는 것을 알았습니다 (아마도 저뿐입니다).

나는 간단하고 깔끔한 구문으로 인해 Mockito를 좋아합니다. 최소한의 구문은 일반적인 경우를 매우 잘 지원하도록 설계되었지만 몇 번 더 복잡한 작업을 수행해야했지만 원하는 것을 지원하고 이해하기 쉽다는 것을 알았습니다.

다음은 Mockito 홈페이지의 요약입니다.

import static org.mockito.Mockito.*;

List mockedList = mock(List.class);
mockedList.clear();
verify(mockedList).clear();

그것보다 훨씬 간단하지 않습니다.

내가 생각할 수있는 유일한 단점은 정적 메서드를 조롱하지 않는다는 것입니다.


15
아름다운. 정적 메소드의 경우, Mockito를 JMockit과 결합하면 실제로 테스트 할 수있는 "레거시"클래스는 없습니다.
Epaga

6
나는 당신이하지 말아야 할 일을하려고 할 때 (예 : 모의 인라인 만들기) 예외 메시지에서 잘못한 것에 대해 매우 명확하게 설명하는 방법을 좋아합니다.
ripper234

3
나를 위해, 절대적으로. 나는 여전히 무조건 추천합니다. 물론, 귀하의 요구를 더 잘 충족시키는 다른 프레임 워크를 찾으면 다른 답변으로 언급하고 어떤 표를 받고 어떤 종류의 의견을 받는지 확인하십시오.
브라이언 Laframboise

2
@MexicanHacker 왜 안드로이드에 사용할 수 없습니까? Robolectric과 함께 지금 사용하고 있습니다.
Ilkka

2
나는 Mockito를 사용하고 그것을 사랑하고 있습니다!! 훌륭한 문서 (이 품질에 대한 문서를 찾기가 드물기 때문에 저자의 훌륭한 직업)는 프레임 워크의 코드를 파지 않고 물건을 사용하는 데 매우 중요합니다!
Renato

84

저는 PowerMock을 만든 사람이므로 반드시 추천해야합니다! :-)

PowerMock정적 메소드 , 최종 및 개인 메소드 를 조롱 하는 기능으로 EasyMock과 Mockito를 모두 확장합니다 . EasyMock 지원은 완료되었지만 Mockito 플러그인에는 더 많은 작업이 필요합니다. JMock 지원도 추가 할 계획입니다.

PowerMock은 다른 프레임 워크를 대체하기위한 것이 아니라 다른 프레임 워크가 조롱을 허용하지 않는 까다로운 상황에서 사용될 수 있습니다. PowerMock에는 정적 이니셜 라이저 및 생성자 억제 와 같은 다른 유용한 기능도 포함되어 있습니다 .


Powermock은 호스트 PC에서 네이티브 Java를 사용하여 안드로이드 애플리케이션을 테스트하는 데 필수적입니다 (느린 에뮬레이터 사용은 피함)
Jeff Axelrod

@Jan 유일한 문제는 내가 @RunWith (PowerMockRunner.class) 및 @RunWith (RobolectricTestRunner.class)하고 싶어하지만 :-( Robolectric를 사용할 때 PowerMock가 호환되지 않는 것입니다
Blundell은

지난 몇 개월 동안 PowerMock을 사용한 후 진심으로 추천합니다!
cwash

PowerMock은 정말 대단합니다. 나는 정적 싱글 톤이 모든 것에 액세스하는 것을 정말로 좋아하며, 이것이 테스트를 가능하게합니다.
이안 Macalinao

주의 사항 : 최종 방법을 조롱하는 것과 같은 것들은 Mockito가 아닌 PowerMock for EasyMock에서만 가능합니다. 자주 사용하지 않으면 약간의 문제입니다. 왜 무언가가 작동하지 않는지 궁금해서 도코의 Easymock 섹션에만 나열되어 있음을 깨달았습니다.
trafalmadorian

46

JMockit 프로젝트 사이트는 현재 조롱 툴킷에 대한 비교 정보를 많이 포함되어 있습니다.

특히, EasyMock, jMock, Mockito, Unitils Mock, PowerMock 및 물론 JMockit을 다루는 기능 비교 매트릭스를 확인하십시오 . 가능한 한 정확하고 최신 상태로 유지하려고 노력합니다.


1
JMockit에 깊은 인상을 받았으며 학습 곡선이 가파르지만 수년간 매우 훌륭한 문서가 있으며 어떤 것도 조롱 할 수 있습니다. 나는 배우기 쉬운 Mockito로 시작했지만 정기적으로 해결할 수없는 문제를 만났습니다. 반면에 JMockit으로 불가능한 것을 상상조차 할 수 없습니다.
Hontvári Levente

21

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이 필요하다는 것입니다.


네, 정말로 이것을 추천 할 수 있습니다
Epaga

7
업데이트 만 : JMockit 프로젝트가 code.google.com/p/jmockit으로 이동했습니다 . 이 포스트 이후로 많은 것을 발전 시켰으며 (그리고 여전히 발전하고 있음), 현재 광범위한 문서를 가지고 있습니다.
Rogério

JMockit이 다시 움직였습니다. 이제 Github에서 사용할 수 있습니다. jmockit.github.io
라비 타 필리 야

15

Groovy를 사용한 테스트를 살펴볼 수도 있습니다. Groovy에서는 'as'연산자를 사용하여 Java 인터페이스를 쉽게 조롱 할 수 있습니다.

def request = [isUserInRole: { roleName -> roleName == "testRole"}] as HttpServletRequest 

이 기본 기능 외에도 Groovy는 강력한 클래스 MockForStubFor클래스를 포함하여 조롱 전선에서 훨씬 더 많은 것을 제공합니다 .

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


13

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

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

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

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

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


1
+1이 답변에는 더 많은 투표가 필요합니다. 프레임 워크에 대해 그들이 실제로 좋아하거나 싫어하는 것을 공유해야합니다. 그냥 "이걸 사용 했어요. 좋아요!" 그런 좋은 질문이 SO에서 종결되는 이유 중 하나입니다.
Ravi Thapliyal

11

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


1
내 질문에, 나는 당신이 모의 프레임 워크에 대해 좋아하고 싫어하는 것을 더 찾고있었습니다. 설명서를 찾아서 읽을 수 있습니다. 문서를 사용한 사람들이 어떻게 생각하는지 알고 싶습니다.
Josh Brown

EasyMock은 Java 5 이상에서만 작동합니다. 아아!
matt b

8

나는 JMock을 일찍 사용했다. 마지막 프로젝트에서 Mockito를 사용해 보았고 좋아했습니다. 더 간결하고 더 깨끗합니다. PowerMock은 정적 코드 조롱, 인스턴스 생성 조롱, 최종 클래스 및 메소드 조롱과 같이 Mockito에없는 모든 요구를 충족시킵니다. 작업을 수행하는 데 필요한 모든 것이 있습니다.


6

JMock을 좋아하므로 기대치를 설정할 수 있습니다. 이것은 일부 모의 라이브러리에서 메소드가 호출되었는지 확인하는 것과는 완전히 다릅니다. JMock을 사용하면 매우 정교한 기대치를 작성할 수 있습니다. 조롱을 참조하십시오 cheat- .



4

조롱에 가장 적합한 솔루션은 기계가 자동 사양 기반 테스트로 모든 작업을 수행하도록하는 것입니다. Java의 경우 ScalaCheckReductio 프레임 워크에 포함 된 기능적 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 구현입니다.


3

Mockito는 호출의 수 확인, 인수 (anyInt 같은 ()와 anyString ())를 일치 스텁 방법의 옵션을 제공하지 않습니다 () 회 (3), atLeastOnce을 (결코 ()), 그리고 더 .

또한 Mockito가 간단하고 깨끗 하다는 것을 알았습니다 .

내가 Mockito에 대해 싫어하는 것 중 하나는 정적 메소드를 스텁수 없다는 것 입니다.


이 답변은 정확하지 않습니다. jMock과의 인터페이스로 제한되지 않습니다. ClassImposteriser를 사용하여 구체적인 클래스를 조롱 할 수 있습니다.
테플론 테드

EasyMock으로도 똑같은 일을 할 수 있습니다.
Cem Catikkas

내 답변에서 부정확성을 제거했습니다.
Josh Brown

2

약간 다른 점이 있다면 JtestR 에 결합 된 JRubyMocha 를 사용 하여 표현력 있고 간결한 Ruby로 Java 코드에 대한 테스트를 작성할 수 있습니다. JtestR과 함께 유용한 조롱 예제가 있습니다 . 이 접근법의 한 가지 장점은 구체적인 클래스를 조롱하는 것이 매우 간단하다는 것입니다.


1

JMock을 통해 모의를 사용하기 시작했지만 결국 EasyMock을 사용하도록 전환했습니다. EasyMock은 더 간결하고 자연스러운 느낌을주는 구문을 제공했습니다. 나는 이후로 전환하지 않았습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.