Запросы насмешливых методов в другом классе, кроме тестового класса без PowerMock - PullRequest
0 голосов
/ 08 июля 2019

У меня возникли проблемы с написанием модульного теста для моего приложения.В настоящее время я тестирую класс A. В тестируемом методе класса AI он вызывает метод вспомогательного класса, который затем вызывает другой метод внутри того же вспомогательного класса (getKeyObject), единственной функцией которого является вызов статического методакласс, содержащийся в структуре, которую я использую (buildKeyObject ()).Я пытаюсь заглушить getKeyObject (), чтобы он возвращал макет объекта, который обычно генерируется, но я понятия не имею, как поступить.

Один из способов, который я подумал, - использовать PowerMockito и использовать метод PowerMockito.mockStatic(ClassInFramework.class) для создания макета класса в используемой платформе, а затем использовать when(ClassInFramework.buildKeyObject()).thenReturn(KeyObjectMock), но из-за некоторых ограничений в работе яделаю, мне запрещено использовать PowerMockito.Я также не могу использовать Mockito.spy или аннотацию @spy по тем же причинам.

class ATest{

    public A aInstance = new A(); 

    @Test
    public void test(){
        KeyObject keyObjectMock = Mockito.mock(KeyObject.class); 
        /*
        between these 2 lines is more mockito stuff related to the KeyObjectMock above. 
        */
        String content = aInstance.method1(); 
        Assert.assertEquals(content, "string")
    }
}
class A{
    public RandomClass d = new RandomClass()
    public String method1(){
        Helper helper = new Helper(); 
        Object a = helper.method2()
        return d.process(a); 
    }
}
class Helper{
    public Object method2(){
        KeyObject keyObject = getKeyObject(); 
        Object object = keyObject.getObject(); 
        return object; 
    }
    public KeyObject getKeyObject(){
        return ClassInFramework.buildKeyObject(); //static method call. 
    }
}

Можете ли вы, ребята, помочь мне с этим?

1 Ответ

1 голос
/ 08 июля 2019

Внедрение в конструктор - один из распространенных способов сделать это.Для упрощения тестирования требуется изменить тестируемый класс.

Сначала вместо создания new Helper в методе сделайте его переменной-членом и присвойте его в конструкторе.

class A {

    private Helper helper;

    // constructor for test use
    public A(Helper helper) {
        this.helper = helper;
    }

    // convenience constructor for production use
    public A() {
        this(new Helper());
    }
}

Теперь в своем тесте вы можете использовать конструктор теста для внедрения любого фиктивного объекта, полученного из Helper.Это можно сделать с помощью Mockito или даже простого наследования.

class MockHelper extends Helper {

    // mocked methods here
}

class ATest {

    public A aInstance = new A(new MockHelper());

    // ...
}
...