2009-08-13 2 views
2

Я только что пришел в мир easymock. Мне бы хотелось спросить, не делает ли easymock мошенничество объекту для интерфейсов? Итак, в попытке понять, что я написал класс для генерации уникального ваучера в java.i, очевидно, не может знать, какое значение он будет генерировать для использования в assert stuff. Так как убедиться, что сгенерированный ваучер имеет тип long?проверить тип объекта с помощью easymock

здесь функция

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

хорошо это может выглядеть потрясающе для вас, но я до сих пор путают о том, как сделать это спасибо за помощь

+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

Я ценю объяснение.thanks –

3

Я считаю, что вы неправильно поняли, как используется easymock, Вызывающий ожидание говорит обманному объекту, что когда вы его воспроизводите, это вызов должен быть вызван. Добавление .andReturn() Сообщает, что макет-объект возвращает все, что вы там вложили, в моем примере длинное значение 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» только обманывает интерфейсы. Прочтите документацию для получения дополнительной справки Easymock

+0

очень хорошее описание. Мне нравится. Спасибо –

0

EasyMock Class extension могут издеваться классы. Это расширение для EasyMock. Он по-прежнему может насмехаться над интерфейсом, поэтому он почти заменяет EasyMock.

Однако в вашем случае вы пытаетесь издеваться над статическим методом. Статический метод не может насмехаться, так как они не могут быть перегружены. Для этого вам нужна классная аппаратура, которую EasyMock не делает.

Смежные вопросы