2015-02-11 32 views
1

当我用Mockito.mock()嘲笑一个对象时,我希望对象具有stubbed out方法,该方法返回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

解决方法是使engageStarter()公开。

+0

因为我不想这样做,所以我去寻找为什么Mockito不会将包私有方法剔除... – Tremelune 2015-02-11 18:51:02

+0

情节变得更加糟糕: https://code.google.com/p/mockito/issues/detail?id = 127 看起来#7响应了一些东西,对于这个Android项目,被测试的源代码位于不同的源代码目录中。 – Tremelune 2015-02-11 18:52:56

+1

这是由于类加载器。只有当类由同一个类加载器加载时,程序包私有可见性才有效。 Mockito嘲笑总是被加载到他们自己的类加载器中。 – 2015-02-12 01:57:49