被测试的类中的模拟类
我怎么能和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()); }
我可以欺骗AnythingPerformerClass
从AnythingPerformerClass
排除不必要的逻辑吗? 我可以覆盖doSomething()
方法以简单返回true
或false
吗?
为什么我指定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)