2014-09-29 2 views
0

Если я пишу модульный тест для класса Singleton, то как я могу об этом насмехаться над личным методом класса Singleton. Код образца сниппет для сценария Ищу ниже: -Как обмануть частный метод класса Singleton, если сам класс тестируется с помощью PowerMock?

Class Singleton { 
    private static Singleton instance = new Singleton(); 

    protected Singleton() {} 
    public Singleton synchronized getInstance() { return instance;} 

    public int method1(int a) { 
     int ret = method2(a); 
     return ret; 
    } 

    private int method2(int num) { return num + 1;} 
} 

Как я могу издеваться method2, чтобы проверить method1 в приведенном выше примере?

+1

Почему вам нужно издеваться method2, чтобы проверить method1? – clD

+0

Я новичок в тестировании устройств. Я думал, что для того, чтобы протестировать метод1, мне придется создать фиктивный метод2, чтобы не было вызова на фактический метод2. Если мой подход неверен, любезно скажите мне, как мне идти об модульном методе тестирования1? – Siddharth

ответ

1

Чтобы проверить method1, вам просто нужно проверить его, как и любой другой метод. Объект, тестируемый в этом случае, не должен издеваться над классом Singleton.

Создание тестового объекта, т.е. вашего класса проверяемого (испытуемый), обычно в способе установки, то:

@Test 
public void testMethod1() { 
    int testValue = 1;  
    int expectedResult = 2; 

    assertThat(testee.method1(testValue), equalTo(expectedResult)); 
} 

В приведенном выше примере, я хотел бы использовать параметризованное тестирование с чем-то вроде JUnitParams, чтобы проверить границы, например, Integer MAX_VALUE и т.д.

@Test 
@Parameters(method = "method1Params") 
public void testMethod1(int testValue, int expectedResult) { 
    assertThat(testee.method1(testValue), equalTo(expectedResult)); 
} 

@Ignore 
private final Object[] method1Params() { 
    return new Object[] { 
     new Object { 1, 2 }, 
     new Object { -2, -1 } 
    }; 
} 

Mocking в основном используется, когда вы хотите, чтобы проверить SUT, в этом случае Singleton в отрыве от других компонентов (сотрудники), чтобы убедиться, что он ведет себя правильно. В этом случае это необязательно.

Когда вы могли бы использовать макет

public int method1(DependedOnComponent doc) { 
    int a = 1; 

    int ret = doc.method2(a); 

    return ret; 
} 

затем

@Test 
public void testMethod1() { 
    DependedOnComponent mockDOC = mock(DependedOnComponent.class); 

    // When method2() is called you control the value returned 
    when(mockDOC.method2(1)).thenReturn(2); 

    assertThat(testee.method1(mockDOC), equalTo(2)); 
} 
+0

Спасибо за ваш ответ. Итак, я считаю, что ожидается, что тест на метод (здесь method1) может сделать вызов других частных методов (здесь method2) того же класса. Я говорю это потому, что «assertThat (testee.method1 (testValue), equalTo (expectedResult)); также сделает фактический вызов метода2. – Siddharth

+0

Да, не рекомендуется издеваться над частными методами. Также метод 'method1', вызывающий' method2', позволяет вам проверять поведение частного метода. Несмотря на то, что в большинстве случаев частные вопросы не проверяются напрямую, а проверяются через публичный API. Здесь есть хорошая дискуссия по тестированию частных методов. http://stackoverflow.com/questions/105007/should-i-test-private-methods-or-only-public-ones – clD

+0

Спасибо за ваш ответ. – Siddharth

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