2016-12-02 12 views
1

Мне нужно высмеять метод внутри метода void.Как издеваться над методом, который вызывается другим методом с помощью EasyMock?

Вот мой пример кода:

class MyClass { 

    public MyClass(Session s, Boolean b1, Boolean b2) 

    void myMethod(some paramaters...) { 

     // some code 
     int count= setSize(); 
    } 

    int setSize() { 

     // some calculation.... 
     return size; 
    } 

Теперь в моем тестовом классе я хочу издеваться setSize() вернуть свое собственное значение сказать 300.

Я сделал, как:

MyClass mockclass = createNiceMock(MyClass.class); 
EasyMock.expect(mockimplyZero.setBatchSize()).andReturn(Integer.valueOf(300)); 

mockclass.myMethod(parameters....) 

когда вызов myMethod, это не будет должным образом в метод. Я думаю, что EasyMock устанавливает значения по умолчанию для конструктора MyClass. Как правильно выполнить фикцию?

Там нет методов в MyClass кроме конструктора, myMethod и setSize

+0

Подсказка: прочитайте о соглашениях об именах java. Имя метода go camelCase; так делают поля; но имена классов идут UpperCase. Это важно; поскольку отклонение от этих стандартов делает ваш код ** труднее ** читать для других людей. – GhostCat

ответ

0

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

Первый испытанный класс. Вам нужно будет создать частичный макет. getSize следует издеваться, но myMethod должен, так как это проверенный метод.

Кроме того, часто требуется вызвать конструктор для правильной инициализации класса (классический макет не будет вызывать никакого конструктора).

class MyClass { 

    private boolean b1; 
    private boolean b2; 

    public MyClass(boolean b1, boolean b2) { 
    this.b1 = b1; 
    this.b2 = b2; 
    } 

    int myMethod() { 
    return getSize(); 
    } 

    int getSize() { 
    return 42; 
    } 

    public boolean getB1() { 
    return b1; 
    } 

    public boolean getB2() { 
    return b2; 
    } 
} 

Испытание будет тогда следующее

import org.junit.Test; 

import static org.easymock.EasyMock.*; 
import static org.junit.Assert.*; 

public class MyClassTest { 

    @Test 
    public void test() { 
    // Create a partial mock by calling its constructor 
    // and only mocking getSize 
    MyClass mock = createMockBuilder(MyClass.class) 
     .withConstructor(true, true) 
     .addMockedMethod("getSize") 
     .createMock(); 

    // Record that getSize should return 8 (instead of 42) 
    expect(mock.getSize()).andReturn(8); 

    // All recording done. So put the mock in replay mode 
    replay(mock); 

    // Then, these assertions are to prove that the partial mock is 
    // actually doing what we expect. This is just to prove my point. Your 
    // actual code will verify that myMethod is doing was is expected 

    // 1. Verify that the constructor was correctly called 
    assertEquals(true, mock.getB1()); 
    assertEquals(true, mock.getB2()); 
    // 2. Verify that getSize was indeed mocked 
    assertEquals(8, mock.myMethod()); 

    // Check everything expected was indeed called 
    verify(mock); 
    } 
} 

работы сделано. Обратите внимание, что это не обязательно является признаком плохого дизайна. Я часто использую его при тестировании Template method pattern.

0

Вы не должны издеваться один метода при тестировании другого метода на же класса. Теоретически вы можете это сделать (используя, например, Mokito spy ).

В этом смысле вы приближаетесь к этому на неправильном уровне: на самом деле вам не нужно беспокоиться о том, какие другие методы тестируются вашим методом под вашим тестируемым классом. Но если вам нужно адаптироваться к тестированию, тогда путь (например) - это метод, который позволяет вашему тестовому коду установить размер поле до вызова mymethod().

Или: вы разделяете проблемы и перемещаете эту «размерную» часть в свой класс X. И тогда ваш тестируемый класс может содержать экземпляр X; и тогда этот экземпляр может быть высмеян.

Короче говоря: вы хотите отступить и прочитать несколько руководств о том, как использовать EasyMock. Это не то, чему вы можете научиться методом проб и ошибок.

+0

ohh это ... Я должен каким-то образом издеваться над этим setSize() как вызывающим веб-сервисом внутри, и его сбоем во время тестирования. –

+0

есть ли другой способ достичь этого? –

+1

Это очень * зависит от того, что вы на самом деле хотите сделать. Но поверьте мне: ваш нынешний подход - это не ** разумный дизайн. Не пытайтесь применять этот подход; просто потому, что это тот, который у вас есть в вашем коде. Вам лучше отступить и научиться делать такие вещи «правильным» способом; иначе EasyMock не будет сильно ценить ваши тестовые действия; и, в конце концов, вы чувствуете, что «этот блок тестирования не работает». – GhostCat