2014-03-19 69 views
3

好吧,我再次被Mockito困住了。这里的情况:验证是否从被测方法调用了继承的超类方法

我有一个超类和子类:

class Parent { 
    protected void insertData() { 
     // Here is some database related stuff 
     someObject.storeData(); 
    } 
} 


class Child extends Parent { 

    private String name; 

    public void printHierarchy(int x) { 
     if (x > 1) { 
      insertData() 
     } else { 
      System.out.println("Child"); 
     } 

    } 
} 

而且在我的单元测试类,我测试ChildprintHierarchy()方法:

@RunWith(SpringJUnit4ClassRunner.class) 
public class ChildTest { 

    @InjectMocks // To inject mock objects 
    private Child child = new Child();  

    @Before 
    public void setUp() { 
     MockitoAnnotations.initMocks(this); 
     // This is where the issue is 
     doNothing().when(child).insertData(); 
    } 

    @Test 
    public void testPrintHierarchy() { 
     child.printHierarchy(5); 
     // Here also 
     verify(child, times(1)).insertData(); 
    } 
} 

所以问题是,我如何验证方法是否从Child#printHierachy()被调用?

当我尝试上面的代码,我得到的错误是:

Argument passed to when() is not a mock! 

当然,child不是模仿。我正在测试那个班。但我该如何解决这个问题?

不,我没有找到任何重复的。一个问题虽然非常相似,但它并没有帮助我。

+0

几乎(但不完全)重复的http://stackoverflow.com/questions/10092926/verifying-sequence-of-private-method-calls-in-unit-testing – Raedwald

回答

1

是否方法printHierachy()调用方法printParent()肯定是方法printHierachy()的实现细节,所以不应该进行测试。单元测试应该检查一个方法是否具有所需的输出。

对于打印方法,请检查打印输出的格式。对于更新数据库的方法,请检查数据库是否包含期望值。对于以指定方式操作域模型对象的方法,请检查域对象是否处于正确的状态。等等。

+0

其实这不是真正的场景。 'printParent()'方法实际上是将某些东西插入到数据库中。该方法是基于某种条件调用的。我需要检查该方法是否被调用。也许我会更新我的问题。 –

1

我认为你需要为孩子使用间谍而不是模拟。

3

您需要使用spy()。以下代码有效:

public final class Bin 
{ 
    @Test 
    public void spyMe() 
    { 
     final Child c = spy(new Child()); 
     doNothing().when(c).printParent(); 
     c.printHierarchy(1); 
     verify(c).printParent(); 
    } 
} 

class Parent { 
    protected void printParent() { System.exit(0);} 
} 

class Child extends Parent { 

    private String name; 

    public void printHierarchy(int i) { 
     if (i > 0) 
      printParent(); 
    } 
} 
+0

好吧,我只是尝试'间谍()',但它不工作。当我们使用间谍时,在一个类中的引用会发生什么?它们是否为空?目前我正在使用@InjectMocks注入一些模拟对象 –

+0

你是什么意思的“在课堂上的参考”? – fge

+0

'Child'类包含一些其他对象。我在嘲笑和注入。当我使用'@ Spy'时,它们会是'null'吗? –

0

我认为这个错误可能是概念性的。如果Child扩展了Parent,那么Parent的方法是实现的一部分,即被测系统。

如果Parent需要独立的Child的嘲笑,那么也许你应该使用的,而不是继承组成:

public class Child { 
    private Parent parent; 

    public void printHierarchy() { 
     parent.printParent(); 
    } 

    // setters/getters 
} 

现在Parent是mockable,你可以测试printParent()是否被调用,还是没有。

如果类层次结构在概念上正确,那么你应该需要测试内部实现细节(即该接口/ public方法调用其他一些)。你不关心实现细节。