2013-12-14 51 views
0

我对嘲笑/ stubbing有一个非常基本的理解。理解嘲讽/ stubbing - mockito

当您在测试代码存根,如:

test h = mock(test); 
when(h.hello()).thenReturn(10); 

,并在源逻辑我有这样的代码:

test src = new test(); 
src.hello(); 

现在将存根被调用,因为我已经存根问候方法或由于实例是不同的它会不会被截断?有没有什么方法来保存班级的所有实例?

回答

1

更好的办法如何编写可测试代码是不要在类代码中通过new运算符创建合作类,而是将合作类作为构造函数参数传递。

class TestedClass{ 
private final Helper helper; 
pubic TestedClass(Helper helper){ 
     this.helper = helper; 
} 

public aMethodUsesHelper(){ 
     //hello is weird name for method that returns int but it is link to your code 
     int aVar =this.helper.hello(); 
     …. 
} 
… 

然后,在测试类

Helper helper = mock(Helper.class); 
when(helper.hello()).thenReturn(10); 
TestedClass tested = new Tested(helper); 
….. 
+0

将被测试类中的helper设置为我的模拟的反射也可以选择吗?如果我错了,请纠正我。 – user1192671

+0

是的,你可以但只有在它分配给构造函数中的一个字段而不是在被测方法中动态创建的情况下。你可以使用特殊的类加载器来加载模拟版本的helper类,但相信我最好的方法是用在构造函数中传递的合作类编写易于测试的代码。像春天这样的工具完全支持它。 – JosefN

+0

那么我明白编写可测试的代码。现在我正在使用遗留代码,所以我现在需要一个解决方法。那么,如果构造函数中的字段是动态创建的,但是我在运行测试时将其分配给了我的模拟呢?它应该工作正确吗? – user1192671

2

您需要使用工厂模式,并将模拟工厂注入创建实例的类中。

所以,如果你想要写测试设置一些类Foo,需要在其代码的地方创建的Bar情况下,你将需要注入BarFactoryFoo。通过将BarFactory传入构造函数或set方法或使用像Guice这样的依赖注入框架,注入可以以旧式的方式发生。的老式的方式一个简单的例子:现在

class Foo { 

    private final BarFactory mFactory; 

    public Foo(BarFactory factory) { 
     mFactory = factory; 
    } 

    public void someMethodThatNeedsABar() { 
     Bar bar = mFactory.create(); 
    } 

} 

,在您的测试类,你可以注入的Bar一个嘲笑BarFactory可以产生轻慢实例:

Bar mockBar = mock(Bar.class); 
BarFactory mockFactory = mock(BarFactory.class); 
when(mockFactory.create()).thenReturn(mockBar); 
Foo objectForTest = new Foo(mockFactory); 
+0

我完全不明白你说的是什么。你说它不会被src对象残留,是吗? – user1192671

+0

我希望编辑能够很好地解释。 – Dave

+0

任何一种方式OP可以使用“h”实例的测试也可以,而不是src对象进行stubbing – Sikorski

1

您需要使用嘲笑的实例来获得存根工作。 干杯:)