Насмешка конструктора Powermock не влияет на созданный объект

    Class  A{

    B objB = new B();
    objB.someBMethod();

    }

    Class B{

    public void someBMethof(){

    C objC = new C();

    }
    }

    class C{
    int a=1;
    public C(){}
    public C(int v){
    a=v;
    }
    }

@RunWith( PoswerMockRunner.class )
@PrepareForTest({ A.class, B.class, C.class})
Class TestApp{

    @Mock
    C mockC;

    PowerMockito.whenNew( C.class ).withNoArguments().thenReturn(mockC);

}

Приведенный выше код фиксирует то, что я пытаюсь сделать. Но whenNew(), похоже, не работает, и когда я пытаюсь отладить созданный объект C, это не макет. Не знаю, что происходит. Некоторые указатели будут высоко оценены. спасибо


person broun    schedule 13.03.2013    source источник


Ответы (1)


Вы предоставляете код, так что спасибо. Но в следующий раз рассмотрите возможность публикации sscce (правильный (компилируемый) пример).

Я попробовал (и исправил ваш код), и он работает. Это моя версия вашего кода:

public class A {

    public int someAMethod() {
        B objB = new B();
        return objB.someBMethod();
    }
}

public class B {

    public int someBMethod() {
        C objC = new C();
        return objC.getA();
    }
}

import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.when;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class)
@PrepareForTest({ A.class, B.class, C.class })
public class TestApp {

    @Mock
    C mockC;

    @Test
    public void shoudlReturnTheCValue() throws Exception {
        when(mockC.getA()).thenReturn(666);
        PowerMockito.whenNew(C.class).withNoArguments().thenReturn(mockC);
        assertEquals(666, new A().someAMethod());
    }
}

Я настроил проект maven со следующими зависимостями:

<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-api-mockito</artifactId>
    <version>1.5</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-module-junit4</artifactId>
    <version>1.5</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-all</artifactId>
    <version>1.9.5</version>
    <scope>test</scope>
</dependency>
person gontard    schedule 13.03.2013
comment
Хорошо, я буду смотреть дальше, где я делаю по-другому. спасибо за ответ и обязательно опубликую компилируемый код в следующий раз. И один вопрос: я несколько раз вижу, что подобные вещи when() / whenNew() не могут выполнить заглушку, если переданные аргументы выполняются через сопоставители, а не точные значения, которые передаются во время фактического времени выполнения. Можете ли вы сказать мне, в какой ситуации ожидаются фактические значения и когда можно использовать макчеры? я мог бы получить образец, когда это произойдет? - person broun; 14.03.2013
comment
Вы нашли проблему? Извините, я не понимаю другие вопросы. Возможно, вам следует создать новый вопрос, чтобы получить помощь большего количества людей. - person gontard; 14.03.2013