被测试的类中的模拟类

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

例如:

MyClass.java

class MyClass { public boolean performAnything() { AnythingPerformerClass clazz = new AnythingPerformerClass(); return clazz.doSomething(); } } 

AnythingPerformerClass.java

 class AnythingPerformerClass { public boolean doSomething() { //very very complex logic return result; } } 

并测试:

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

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

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

您可以重构MyClass以便它使用dependency injection 。 您可以将类的实例传递给MyClass的构造函数,而不是让它创建一个AnythingPerformerClass实例,如下所示:

 class MyClass { private final AnythingPerformerClass clazz; MyClass(AnythingPerformerClass clazz) { this.clazz = clazz; } public boolean performAnything() { return clazz.doSomething(); } } 

然后,您可以在unit testing中传递模拟实现

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

或者,如果您的AnythingPerformerClass包含state,那么您可以将AnythingPerformerClassBuilder传递给构造函数。

就像目前一样(在方法中声明和实例化AnythingPerformerClass ,不可能仅使用Mockito来模拟AnythingPerformerClass

如果可能,将AnythingPerformerClass的声明和实例化移动到类级别:声明一个AnythingPerformerClass类型的实例变量,并让它由构造函数实例化。

这样,您可以在测试期间更轻松地注入AnythingPerformerClass的模拟,并指定其行为。 例如:

 when(anythingPerformerClassMock.doSomething()).thenReturn(true); 

或者测试error handling:

 when(anythingPerformerClassMock.doSomething()).thenTrow(new NullPointerException()); 

您可以在Mockito中设置返回的内容。

 when(mock.method()).thenReturn(someValue)