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

时间:2013-11-27 11:07:14

标签: java junit 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。如何最好地进行?

请注意,这些类来自一个我无法更改的框架,因此我无法更改其代码以添加setter或类似的东西。

1 个答案:

答案 0 :(得分:3)

b是一个模拟,所以你不需要注入任何东西。毕竟它没有执行任何真正的方法(除非你通过调用thenCallRealMethod明确地这样做),所以没有必要注入任何ClassANeededByClassB的实现。

如果ClassB是受测试的类或间谍,那么您需要使用@InjectMocks注释,它会将任何匹配的模拟注入ClassB

@RunWith(MockitoJUnitRunner.class)
public class ConstraintBuilderTest {

    @Mock
    ClassANeededByClassB a;

    @InjectMocks
    ClassB b;

    // ...
}

正如你所说,Mockito不支持嘲笑equals。可能有一些解决方法,但我不知道。所以这里只是对它的一些想法:

  • Mockito的方法是,如果你不能用Mockito嘲笑某些东西,它可能设计得很糟糕,应该重构。我知道这不是你的代码,这实际上导致了下一点:
  • “不要测试框架”。您可能根本不需要测试这个部分 - 框架创建者应该负责测试它。如果它是一个开源项目,你可以尝试提供补丁。
  • Mockito有一些自我限制,所以它可能不适合这项工作。还有其他更强大的模拟框架,能够做到这一点。