2

easymock の世界に入ったばかりです。easymock はインターフェイスのオブジェクトをモックするだけですか? したがって、理解するために、Javaで一意のバウチャーを生成するクラスを作成しました。明らかに、アサートで使用するために生成される値を知ることができません。生成されたバウチャーが長いタイプであることを確認するにはどうすればよいですか?

ここに関数があります

 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;
}

ここにテストクラスがあります

@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);
}

これはあなたには素晴らしいように見えるかもしれませんが、私はこれを行う方法についてまだ混乱しています助けてくれてありがとう

4

3 に答える 3

3

easymock の使用方法を誤解していると思います。expect を呼び出すと、モック オブジェクトを再生するときに、この呼び出しを呼び出す必要があることがわかります。追加 .andReturn() モック オブジェクトに、そこに入力したものは何でも返すように指示します。私の例では long 値 1 です。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 はインターフェイスをモックするだけですか? 答えはイエスです。Easymock はインターフェイスをモックするだけです。詳細については、ドキュメントを参照してください

于 2009-08-13T20:19:59.680 に答える
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);
}
于 2009-08-13T20:25:46.703 に答える
0

EasyMock Class 拡張機能は、クラスをモックできます。EasyMock の拡張機能です。インターフェイスをモックできるので、EasyMock にほぼ置き換わります。

ただし、あなたの場合、静的メソッドをモックしようとしています。静的メソッドはオーバーロードできないため、モックできません。そのためにはクラスの計測が必要ですが、EasyMock にはありません。

于 2009-08-17T00:00:10.187 に答える