Mockito:模拟并注入一个模拟类



我目前面临以下测试用例:我想模拟来自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有一些自我强加的限制,所以它可能不是这份工作的合适工具。还有其他更强大、更能做到这一点的嘲讽框架

相关内容

  • 没有找到相关文章

最新更新