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");
}
}
}
因为我不想这样做,所以我去寻找为什么Mockito不会将包私有方法剔除... – Tremelune 2015-02-11 18:51:02
情节变得更加糟糕: https://code.google.com/p/mockito/issues/detail?id = 127 看起来#7响应了一些东西,对于这个Android项目,被测试的源代码位于不同的源代码目录中。 – Tremelune 2015-02-11 18:52:56
这是由于类加载器。只有当类由同一个类加载器加载时,程序包私有可见性才有效。 Mockito嘲笑总是被加载到他们自己的类加载器中。 – 2015-02-12 01:57:49