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

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의 경우 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 구현입니다.


3

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

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

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


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

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

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

2

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


1

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

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