2015-12-02 99 views
0

我使用Mockito编写一个简单的单元测试。我有一个smiple 抽象类,它实现Runnable的Mockito:验证所捕获的对象的方法被调用

public abstract class MyRunnable implements Runnable { 
    @Override 
    public void run() { 
    doTask(); 
    } 
    public abstract void doTask(); 
} 

然后,在测试中的功能使用MyRunnable

public class MyService { 
    public void something() { 
    executor.execute(new MyRunnable() { 
     @Override 
     doTask() { 
      … 
     } 
    }); 
    } 
} 

我的测试情况下,我想测试doTask()已运行:

@Test 
public void testSomething() { 
    … 
    ArgumentCaptor<MyRunnable> myCaptor = ArgumentCaptor.forClass(MyRunnable.class); 
    verify(mockMyService).something(myCaptor.capture()); 

    // get what has been captured 
    MyRunnable myRunnable = myCaptor.getValue(); 
    //verify doTask() has run , but got ERROR. 
    verify(myRunnable).doTask(); 
} 

我测试的情况下抛出以下错误:

org.mockito.exceptions.misusing.NotAMockException: 
Argument passed to verify() is of type and is not a mock! 

错误提示verify()只接受嘲笑对象。然后,我怎么能确认/测试的捕获MyRunnable对象已运行doTask()用的Mockito?

回答

1

如果你有超过你的代码的控制,你可以让你的代码可测试用的Mockito工厂类是这样的...

public class MyService { 

    private MyRunnableFactory = factory; 

    public MyService(MyRunnableFactory factory) { 
    this.factory = factory; 
    } 

    public void something() { 
    executor.execute(factory.createInstance()); 
    } 
} 

然后你的测试可以简单地注入工厂的模拟,你可以verify其行为/互动

@Mock MyRunnableFactory factory; 
@Mock MyRunnable myRunnable; 

@Test 
public void testSomething() { 

    when(factory.createInstance()).thenReturn(myRunnable); 

    // method under test 
    MyService service = new MyService(); 
    service.something(); 

    verify(myRunnable).doTask(); 
} 

我用经验法则的类创建的对象,不应该有任何的业务逻辑,所以你没有这些测试头痛。这在本质上是Single Responsibilty Principal

+0

谢谢,这也是我的想法太:) – user842225

0

因为MyRunnable由代码测试创建你不能做的Mockito此。但是你可以看看PowerMock,因为它可以让你嘲笑的构造器:通过移动使用new关键字到一个单独的任何代码https://github.com/jayway/powermock/wiki/MockConstructor

+0

有没有一种方法来捕捉嘲笑MyRunnable,而不是真实的吗? – user842225

+0

如果注入MyRunnable的实例为为MyService,你传递一个嘲笑的对象,你应该能够做到这一点 – Jorgeejgonzalez

相关问题