2009-08-13 4 views
2

easymockの世界に入ったばかりです。easymockがインターフェイス用のオブジェクトを模倣するかどうか尋ねたいのですが? 私は、java.iで一意の伝票を生成するクラスを作成したことを理解しようと努力していますが、アサルトstuff.Soで使用する値がわからないことは明らかです。ここ easymockでオブジェクトの型を確認する

は、テストクラスも

@Before 
public void setUp() { 
    mockgenerator = createMock(VGenerator.class); 
} 


/** 
* Test of generateID method, of class VGenerator. 
*/ 
@Test 
public void testGenerateID() { 
    Long exp = (long)1; 
    int length = 15; 
    expect(mockgenerator.generateID(length)).equals(Long.class); 
    replay(mockgenerator); 
    long res = mockgenerator.generatedID(length); 
    assertEquals(exp.class, res.class); 
} 

これはあなたに素晴らしい見えるかもしれない機能ここ

public static Long generateID(int length) { 
    logger.info("Calling generateID with specify length"); 
    Long result = null; 

    if (length > 0) { 
     StringBuffer id = new StringBuffer(length); 
     for (int i = 0; i < length; i++) { 
      id.append(NUMS[(int)Math.floor(Math.random() * 20)]); 
     } 
     result = Long.parseLong(id.toString()); 
    } 

    return result; 
} 

されているが、私はまだ

を支援するため、この 感謝を行う方法について困惑しています
+0

generateID()が長いものではないものを返そうとした場合、そのクラスはコンパイルされません。 –

答えて

0

戻り値の型がlongであることが絶対に重要であり、今後の変更で誤ってこれを変更しないようにしたい場合は、easymockは必要ありません。

@Test 
public void TestGenerateIDReturnsLong() 
{ 
    Method method = 
     VGenerator.class.getDeclaredMethod("generateID", new Class[0]); 
    Assert.Equals(long.Class, method.GetReturnType()); 
} 

現在あなたがVGeneratorのモック実装を生成している、とあなたはモックをテスト:ちょうどこれを行います。これはではなく、です。ユニットテストのポイントは、実際の実装をテストすることです。だから今あなたはモックが何のために良いのだろうかと思っているかもしれない?一例として、

VGeneratorが内部乱数ジェネレータを使用する必要がある、とあなたが(「依存性の注入」と呼ばれている)コンストラクタでこれを提供することを想像:

public VGenerator 
{ 
    private final RandomNumberGenerator rng; 

    // constructor 
    public VGenerator(RandomNumberGenerator rng) 
    { 
     this.rng = rng; 
    } 

    public long generateID(length) 
    { 
     double randomNumber = this.rng.getRandomNumber(); 
     // ... use random number in calculation somehow ... 
     return id; 
    } 
} 

VGeneratorを実装する場合、あなたは乱数ジェネレータのテストに本当に関心がありません。あなたが興味を持っているのは、VGeneratorが乱数ジェネレータを呼び出す方法と、結果を使って出力を生成する方法です。何が欲しいのは、あなたがそれのモック を作成するので、テストの目的のために乱数生成器の完全な制御を取ることです。

@Test 
public void TestGenerateId() 
{ 
    RandomNumberGenerator mockRNG = createMock(RandomNumberGenerator.class); 
    expect(mockRNG.getRandomNumber()).andReturn(0.123); 
    replay(mockRNG); 

    VGenerator vgenerator = new VGenerator(mockRNG); 
    long id = vgenerator.generateID(); 
    Assert.Equals(5,id); // e.g. given random number .123, result should be 5 

    verify(mockRNG); 
} 
+0

私は説明を感謝します。 –

3

あなたはeasymockがどのように使われているのか誤解していると思います。 expectを呼び出すと模擬オブジェクトに、再生時にコールを呼び出す必要があります。 Append .andReturn()モックオブジェクトに、あなたがそこに置いたものを返すように指示します。例では1のlong値です。 easymockのポイントは、それを使用するクラスをテストするために模擬インターフェイスを実装する必要がないということです。模擬することによって、クラスを依存するクラスからクラスを分離し、現在テストしているクラスの含まれているコードのみをテストすることができます。

interface VGenerator { 
    public Long generateID(int in); 
} 


@Before 
public void setUp() { 
    mockgenerator = createMock(VGenerator.class); 
} 


@Test 
public void testGenerateID() { 
    int length = 15; 
    expect(mockgenerator.generateID(length)).andReturn(new Long(1)); 
    replay(mockgenerator); 
    myMethodToBeTested(); 
    verify(mockgenerator); 
} 

public void myMethodToBeTested(){ 
    //do stuff 
    long res = mockgenerator.generatedID(length); 
    //do stuff 
} 

あなたの質問に誤解があり、実際には、easymockはモックインターフェイスだけですか?答えはYesです。Easymockはインターフェイスをモックします。その他のヘルプについては、ドキュメントを参照してくださいEasymock

+0

非常に良い説明です。私はそれを好きです。おかげで –

0

EasyMock Class extensionクラスをモックすることができます。これはEasyMockの拡張版です。それはまだインターフェイスをモックすることができますので、EasyMockの代わりになります。

しかし、あなたの場合、静的メソッドをモックしようとしています。静的メソッドは過負荷にならないので、嘲笑することはできません。 EasyMockではそうすることができないようにするには、クラスの計測が必要です。

関連する問題