被测试的类中的模拟类

Nik*_*Lab 17 java unit-testing junit4 mockito robolectric

我怎么能和Mockito一起模拟我班上正在测试的其他课程?

例如:

MyClass.java

class MyClass {
    public boolean performAnything() {
        AnythingPerformerClass clazz = new AnythingPerformerClass();
        return clazz.doSomething();        
    }
}
Run Code Online (Sandbox Code Playgroud)

AnythingPerformerClass.java

class AnythingPerformerClass {
    public boolean doSomething() {
        //very very complex logic
        return result;
    }
}
Run Code Online (Sandbox Code Playgroud)

并测试:

@Test
public void testPerformAnything() throws Exception {
    MyClass clazz = new MyClass();
    Assert.assertTrue(clazz.performAnything());
}
Run Code Online (Sandbox Code Playgroud)

我可以欺骗AnythingPerformerClass从中排除不必要的逻辑AnythingPerformerClass吗?我可以覆盖doSomething()简单返回的方法truefalse

为什么我指定Mockito,因为我需要使用Robolectric进行Android测试.

cyo*_*yon 16

您可以重构,MyClass以便它使用依赖注入.AnythingPerformerClass您可以将类的实例传递给MyClass类似的构造函数,而不是让它创建实例:

class MyClass {

   private final AnythingPerformerClass clazz;

   MyClass(AnythingPerformerClass clazz) {
      this.clazz = clazz;
   }

   public boolean performAnything() {         
     return clazz.doSomething();        
   }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以在单元测试中传递模拟实现

@Test
public void testPerformAnything() throws Exception {
   AnythingPerformerClass mockedPerformer = Mockito.mock(AnythingPerformerClass.class);
   MyClass clazz = new MyClass(mockedPerformer);
   ...
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您AnythingPerformerClass包含状态,则可以将a传递AnythingPerformerClassBuilder给构造函数.