2010-05-25 3 views
7

테스트 작성 방법을 배우려고합니다.테스트 시작 방법 (jMock)

http://www.theserverside.com/news/1365050/Using-JMock-in-Test-Driven-Development

http://jeantessier.com/SoftwareEngineering/Mocking.html#jMock

그리고 대부분의 기사 : 나는 또한 자바를 배우고, 나는 내가/사용/연습 jMock을 배워야한다고 들었다, 나는 특정 해당 도움이 같은 확장 온라인 몇 가지 기사를 발견했습니다 테스트 주도 개발에 대해 알았습니다. 먼저 테스트를 작성한 다음 테스트를 통과하는 코드를 작성합니다. 지금 당장은 그것을 찾고 있지 않다. jMock으로 이미 존재하는 코드에 대한 테스트를 작성하려고한다.

official documentation은 모호하고 나에게 너무 어렵습니다. 누구든지 이것을 배우는 더 좋은 방법이 있습니까? 좋은 책/링크/자습서가 많이 도움이 될 것입니다. 당신에게

편집 감사합니다 -보다 구체적인 질문 :

http://jeantessier.com/SoftwareEngineering/Mocking.html#jMock - 문제는이 간단한 클래스 조롱 시도이 문서

에서 : 여기

import java.util.Map; 
    public class Cache { 
     private Map<Integer, String> underlyingStorage; 
     public Cache(Map<Integer, String> underlyingStorage) { 
      this.underlyingStorage = underlyingStorage; 
     } 
     public String get(int key) { 
      return underlyingStorage.get(key); 
     } 
     public void add(int key, String value) { 
      underlyingStorage.put(key, value); 
     } 
     public void remove(int key) { 
      underlyingStorage.remove(key); 
     } 
     public int size() { 
      return underlyingStorage.size(); 
     } 
     public void clear() { 
      underlyingStorage.clear(); 
     } 
    } 

는 I가 시도하는 방법이다 테스트/모의 작성 :

public class CacheTest extends TestCase { 

    private Mockery context; 
    private Map mockMap; 
    private Cache cache; 

    @Override 
    @Before 
    public void setUp() { 
     context = new Mockery() { 
      { 
       setImposteriser(ClassImposteriser.INSTANCE); 
      } 
     }; 

     mockMap = context.mock(Map.class); 
     cache = new Cache(mockMap); 
    } 

    public void testCache() { 
     context.checking(new Expectations() {{ 
      atLeast(1).of(mockMap).size(); 
      will(returnValue(int.class)); 
     }}); 

    } 
} 

그것은 테스트를 통과하고 기본적으로 아무 것도하지 않습니다. 원하는 것은지도를 만들고 그 크기를 확인하는 것입니다. 작업을 통해 약간의 변형이이를 파악하려고합니다. 더 좋은 물마루 예를 이해하고, 여기에서 내가 무엇을 테스트 할 수 있는지, 또는 다른 운동이 많이 도움이 될 것입니다. tnx

+1

답변 없음 : 모의 조사를하기 전에 테스트를 작성하는 방법을 배우는 것이 좋습니다. Mock은 테스트의 고급 주제이므로 먼저 기본 사항을 마스터해야합니다. – Arne

+0

@Arne은 기본으로 간주되는 것을 구체적으로 대답 해 줄 수 있습니까? 저는 빨리 배우고, 다른 사람들보다 더 똑똑하다는 말을하지 않고 배우고 싶어합니다. 내 손에는 충분한 시간을 가지고 있습니다. 따라서 한 가지가 지루 해지면 다른 단순/고급으로 이동할 수 있습니다. 실제로 중요하지 않습니다. tnx – London

+0

조롱 프레임 워크없이 테스트를 작성할 수 있습니다. JUnit을 사용하여 테스트를 작성하십시오. 코드를 유창하게 테스트하고 모의하지 않고도 마스터 할 수없는 경우 조롱 프레임 워크를 사용해보십시오. 모의가 필요한 것은 규칙이 아니라 예외이어야합니다. – Arne

답변

5

는 JUnit을하고 EasyMock에 (개인적으로 JMock보다 사용하기 훨씬 쉽게 찾을 수 조롱 라이브러리)을 사용하는 방법에 대한 튜토리얼입니다 JMock 사용에 전념하는 사람이 100 %이라 할지라도 두 사람 사이의 개념은 동일하므로 더 잘 이해할 수 있습니다.

조롱의 목적은 오히려 B의 실제 구현을 사용하는 것보다 당신이 BC에 따라 클래스 A을 테스트 할 때, A의 테스트가 정확한 동작을 지정 할 수 BC의 모의 버전을 사용한다는 것입니다 그리고 귀하의 시험에서 AC.그렇지 않으면 A의 단일 단위 만 테스트하는 것이 아니며 BC을 암시 적으로 테스트하게됩니다.

+0

당신은 내가 아직 모든 것을 이해하려고 싸우고있는 방법이 아니기 때문에 당신은/생성자를 조롱 할 수 있습니까? – London

+0

일부 라이브러리는 인터페이스가 아닌 클래스 조롱을 지원합니다 (EasyMock 3.0에서는이 문제를 주장합니다). 그러나 저는 그것에 익숙하지 않습니다. 조롱은 클래스가 * 구체적인 클래스 *가 아닌 * 인터페이스 *에 의존하여 서로에 대한 의존성을 표현할 때 빛난다. –

1

테스트에서 모의 ​​객체를 사용하는 방법을 배우는 길을 얼마나 멀리 떨어 뜨 렸는지 알 수 없으므로 간략한 설명을 작성하여 기사의 방향을 알려줌으로써 유용 할 수 있습니다. 당신. 모의 객체는 단위 테스트에서 작성하기가 어렵거나 테스트에 필요한 상태로 만들기가 어려운 외부 종속성을 대체하는 데 사용됩니다. 존재하는 다양한 mocking 프레임 워크는 이러한 종속성 대신 "fake"객체를 만드는 메커니즘을 제공합니다. 이러한 모의 객체는 코드에서 들어오는 호출을 추적하고 나중에 이러한 상호 작용에 대한 단언을 할 수있게 해줍니다. mock 객체에 대한 잘 알려진 기사가 있으며 외부 종속성을 단순화하는 또 다른 일반적인 테스트 전략 인 "스텁 (stub)"과 관련이 있습니다. 그것은 마틴 파울러에 의해 작성되었으며 여기에서 찾을 수 있습니다 : http://www.michaelminella.com/testing/unit-testing-with-junit-and-easymock.html

:

여기 http://martinfowler.com/articles/mocksArentStubs.html

+0

당신은 생성자를 모의 할 수 있습니까? 그들은 여전히 ​​모든 것을 파악하기 위해 노력하고 있습니다. – London

+0

아니요, 조롱은 클래스 수준에서 수행되므로 조롱 프레임 워크는 '프록시'(모의) 개체 생성을 처리합니다. 이 객체는 조롱하는 객체의 동작을 구현하지 않습니다. 목표와의 상호 작용을 추적하고 예상 한대로 이러한 상호 작용을 확인할 수있게하는 것이 목적입니다. –

+0

설명해 주셔서 감사합니다. 어떻게 이러한 방법을 테스트 할 수 있습니까? – London

2

이 공동 작업자 만이 사용할 수있는지도이므로이 클래스를 테스트하기 위해 모의이 필요하지 않습니다. 또한 클래스는 실제로 델리게이트를 제외하고는 아무 것도하지 않습니다. 그래서 많은 것을 테스트하지 않는 것 같은 느낌이 들게됩니다.

직선 시험 (난 당신의 JUnit 4를 사용하고 있으리라 믿고있어 수 있습니다 - 당신의 코드는 모의 코드는 가정 홀수의 JUnit 3의 혼합물 4가 될 것이다 조롱과

@Test 
public void sizeIs0WhenEmpty() 
{ 
    Map<Integer, String> map = Collections.emptyMap(); 
    Cache cache = new Cache(map) 
    assertEquals(0, cache.size()); 
} 

(이다 정확한 - 나는) 두 경우 모두

@Test 
public void sizeIs0WhenEmpty() 
{ 
    context.checking(new Expectations() {{ 
        atLeast(1).of(mockMap).size(); 
        will(returnValue(0)); 
        }}); 
    assertEquals(0, cache.size()); 
} 

을 JMock을 사용하지 않는 사용자 설정을 테스트하고 그대로 다음 (캐시가 동일한 속성을 가지고 있는지 확인하려는 특성을 가지고지도를 설정하여 시스템 직선 대표).

계속하기 전에 about JUnit을 읽는 것이 좋습니다.

4

JMock의 저자로서 TDD에 대한 경험이있을 때까지는이 기술을 사용하지 않겠습니다. 기본으로 시작해서 작동 시키십시오. 일단 규모에 어려움을 겪고 디자인을 성장 시키면 기술로 돌아옵니다.

데이브 아델스 (Dave Astels)의 책은 여전히 ​​좋은 소개이며, 내가 생각하기에 모의를 잘 설명한 세대의 유일한 것 같습니다. 그 후, 우리는 (에헴) "테스트에 의해 인도되는 성장 지향 객체 지향 소프트웨어"

파일 시스템에 대한 테스트를하는 것이 더 빠르다고 말하는 사람을 할인 할 수 있습니다.