Mockito шпион возвращает другой результат, чем фактический вызов метода - PullRequest
4 голосов
/ 09 ноября 2011

У меня есть следующий код:

public Object parse(){
      ....
      VTDGen vg = new VTDGen();
      boolean parsed = vg.parseFile(myFile.getAbsolutePath(), false);
}

Я пишу юнит-тест для этого метода. Когда я запускаю метод без насмешек VTDGen, метод parseFile возвращает true. Однако, когда я шучу над ним со шпионом, он возвращает false.

Мой тест выглядит следующим образом:

@Before
public void setup(){
     VTDGen vtgGen = new VTDGen();
     VTDGen vtgGenSpy = PowerMockito.spy(vtdGen);
     PowerMockito.whenNew(VTDGen.class).withNoArguments().thenReturn(vtdGenSpy);

}


@Test
public void myTest(){
    // when I run the test parseFile returns false
    // if I remove the mocking in the setup, parseFile returns true
}

У меня сложилось впечатление, что шпионские объекты Мокито не должны изменять поведение обернутых объектов, так почему я получаю ложное значение вместо истинного?

Ответы [ 3 ]

1 голос
/ 18 ноября 2011

При шпионаже в классах Powermocked вы должны использовать метод PowerMockito.spy(...):

VTDGen vtgGenSpy = PowerMockito.spy(vtdGen);

Также убедитесь, что ваши версии версий Mockito / Powermock совместимы.Я использую Mockito 1.8.5 и Powermock 1.4.10.

Следующие тесты (TestNG) проходят для меня:

@PrepareForTest({VTDGen.class, Uo.class})
public class UoTest extends PowerMockTestCase {

    private VTDGen vtdGen;
    private VTDGen vtdGenSpy;
    private Uo unitUnderTest;

    @BeforeMethod
    public void setup() {
        vtdGen = new VTDGen();
        vtdGenSpy = PowerMockito.spy(vtdGen);
        unitUnderTest = new Uo();
    }

    @Test
    public void testWithSpy() throws Exception {
        PowerMockito.whenNew(VTDGen.class).withNoArguments().thenReturn(vtdGenSpy);

        boolean result = unitUnderTest.parse();

        assertTrue(result);
    }

    @Test
    public void testWithoutSpy() throws Exception {
        PowerMockito.whenNew(VTDGen.class).withNoArguments().thenReturn(vtdGen);

        boolean result = unitUnderTest.parse();

        assertTrue(result);
    }
}

Для тестируемого устройства:

public class Uo {
    public boolean parse() {
        VTDGen vg = new VTDGen();
        return vg.parseFile("test.xml", false);
    }
}
1 голос
/ 23 ноября 2011

Это было в ответе Ори, хотя и косвенно: вы включили @PrepareForTest (ClassCallingNewVTDGen.class)?

Это класс, вызывающий

new VTDGen()

, который должен быть подготовлен к тесту,В ответе Ори это Uo.class

Источник

1 голос
/ 09 ноября 2011

Может быть, это потому, что вы возвращаете vtdGenMock не vtgGenSpy в

PowerMockito.whenNew(VTDGen.class).withNoArguments().thenReturn(vtdGenMock);

...