我目前面临以下测试用例:我想模拟来自akka:的抽象ActorRef类
@RunWith(MockitoJUnitRunner.class)
public class ConstraintBuilderTest {
@Mock
ClassANeededByClassB a;
@InjectMock
ClassB b;
@Before
public void setUp(){
Mockito.when(a.equals(a)).thenReturn(true);
}
//tests go here
}
我知道mockito页面上说它不能嘲笑平等。那么,有什么想法可以嘲笑这一点吗?
ClassB上的equals方法使用ClassANeededByClassB来检查其相等性。
我能想到的是在被嘲笑的b类中注入a。如何最好地继续?
请注意,这些类来自一个我不能更改的框架,所以我不能更改它的代码来添加setter或类似的东西。
b
是一个mock,因此不需要注入任何内容。毕竟,它没有执行任何真正的方法(除非通过调用thenCallRealMethod
显式地执行),所以不需要注入ClassANeededByClassB
的任何实现。
如果ClassB
是测试中的类或间谍,则需要使用@InjectMocks
注释,该注释将向ClassB
注入任何匹配的mock。
@RunWith(MockitoJUnitRunner.class)
public class ConstraintBuilderTest {
@Mock
ClassANeededByClassB a;
@InjectMocks
ClassB b;
// ...
}
正如您所说,Mockito不支持嘲笑equals
。可能有一些变通办法,但我不知道。因此,这里只是一些关于它的一般想法:
- Mockito的方法是,如果你不能用Mockito模拟一些东西,那么它可能设计得很糟糕,应该进行重构。我知道这不是你的代码,这实际上引出了下一点:
- "不要测试框架"。你可能根本不需要测试这一部分——测试它应该是框架创建者的责任。如果它是一个开源项目,你可以尝试贡献一个补丁
- Mockito有一些自我强加的限制,所以它可能不是这份工作的合适工具。还有其他更强大、更能做到这一点的嘲讽框架