2015-10-19 117 views
0

我正在为使用mockito和testng的类编写测试。要测试的类有几个依赖需要被模拟和注入。要测试的类具有以下轮廓如何模拟注入模拟对象的方法

class A{ 
    @Autowired 
    private Object1; 
    @Autowired 
    private Object2; 
    Object3 methodToBeTested(){ 
      //some code 
      method2(); 
      //some code 
    } 
    boolean method2(){ 
     //some calls to Database that are not operational 
    } 
} 

在我的测试类,我声明的对象Object1和Object2的是嘲笑和初始化它们如下

@Mock 
Object1 ob1; 
@Mock 
Object2 ob2; 
@InjectMocks 
A a = new A(); 

@Test 
public void ATest(){ 
    Object3 ob3; 
    when(ob1.someMethod()).thenReturn(someObject); 
    when(ob2.someMethos()).thenReturn(someOtherObject); 
    ob3 = a.methodToBeTested(); 
    assertNotNull(ob3); 
} 

问题就出现了,因为我有嘲笑对类A的方法2的调用,以及它有一些调用在测试阶段不可操作。 mockito也不允许一个对象同时拥有@Mocks和@InjectMocks注释。有没有一种方法可以在不修改A类代码的情况下进行测试(不想仅仅为了测试而修改它)。

+2

http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#13 –

+0

@JBNizet想让这个答案,我可以upvote它?显然,这是正确的。 –

+0

@DavidWallace完成。谢谢你让我不那么懒惰:) –

回答

2

你需要刺探真实的目的上,如the documentation解释说:

@Mock 
Object1 ob1; 

@Mock 
Object2 ob2; 

@InjectMocks 
A a = new A(); 

@Test 
public void ATest(){ 
    A spy = spy(a); 

    doReturn(true).when(spy).method2(); 

    Object3 ob3; 
    when(ob1.someMethod()).thenReturn(someObject); 
    when(ob2.someMethos()).thenReturn(someOtherObject); 

    ob3 = spy.methodToBeTested(); 

    assertNotNull(ob3); 
} 

注意,这具有指示代码味道的一个很好的机会。也许应该把这个method2()移到另一个类,A将依赖于这个类。

+0

upvote表示代码味道。如果您需要监视,99%的案例需要重构您的代码 –

+0

@JB Nizet谢谢您解决了我的问题! –

+0

@SarthakNigam那么你应该*接受*答案来标记你的问题为答案。见http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235 –