2015-02-11 2 views
1

Когда я издеваюсь над объектом с помощью Mockito.mock(), я ожидаю, что у объекта будут обработаны методы, которые возвращают null, 0, false и другие, без какого-либо кода реального объекта, который я издеваюсь. Я думал, что это поведение по умолчанию на Java, но Android, похоже, включает в себя реальные объекты как часть макетов. Как мне избежать этого?DexMaker Mockito издевается над заглушками, шпионами, частицами или что?

public class MockTest extends InstrumentationTestCase { 
    public void testMock() { 
    Engine engine = mock(Engine.class); 
    Car car = new Car(engine); 

    car.start(); // Null pointer error, because Engine.starter is null. 

    verify(engine, Mockito.times(1)).engageStarter(); 
    } 


    public static class Car { 
    private final Engine engine; 

    public Car(Engine engine) { 
     this.engine = engine; 
    } 

    public void start() { 
     engine.engageStarter(); 
    } 
    } 


    public static class Engine { 
    private final Starter starter; 

    public Engine(Starter starter) { 
     this.starter = starter; 
    } 

    void engageStarter() { 
     starter.spin(); 
    } 
    } 


    public static class Starter { 
    public void spin() { 
     System.out.println("Start or explode"); 
    } 
    } 
} 

ответ

0

Решение состоит в том, чтобы объявить public() публичным.

+0

Поскольку я не хочу, чтобы это сделать, я иду в поисках почему Mockito не гасит пакет-частные метод ... – Tremelune

+0

Сюжета утолщается: https://code.google.com/p/mockito/issues/detail? id = 127 Кажется, что ответ №7 на что-то, как и в этом Android-проекте, тестируемый исходный код находится в другом исходном каталоге. – Tremelune

+1

Это из-за загрузчиков классов. Пакетная видимость работает только тогда, когда классы загружаются одним и тем же загрузчиком классов. Mockito mocks всегда загружаются в свой собственный загрузчик классов. –

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