是否可以使用mockito模拟二级模拟对象的所有字段

时间:2017-09-21 11:05:48

标签: java unit-testing mockito

我在junit测试类中使用mockito框架。

以下是类的依赖关系图:

首先依赖于Second,Second依赖于Third和Fourth。

我想测试First class。在我的测试课中,我模拟了Second的实例。现在我想,对于第二类的模拟实例,第二类的所有字段也应该被模拟,即第二类的模拟实例应该模拟第三和第四类的实例(第二类有两个字段第三和第四)。

在下面的测试类中,我想要模拟的Second实例应该在其中模拟第三和第四实例。

public class FirstTest {

   @Mock
    private Second second;

    @Mock
    private Third third;

    @Mock
    private Fourth fourth;

    @InjectMocks
    private First first = new First();

    @BeforeClass
    public void setUp() throws Exception {
        initMocks(this);
    }


    @Test
    public void testCallSecond() throws Exception {
        first.callSecond();
    }

}



public class First {

    @Autowired
    private Second second;

    public void callSecond() {
        second.call();
    }
}



public class Second {

    @Autowired 
    Third third;


    @Autowired 
    Fourth fourth;


    public void call() {

        System.out.println("third instance ======="+third);
        third.call();
    }


}

是否可以模拟二级模拟对象的所有字段?如果是,请建议。我想只使用Mockito框架来做。

2 个答案:

答案 0 :(得分:3)

使用模拟框架删除瞬态依赖

这意味着在测试First时你会模拟Second,这样做会切断所有进一步的依赖关系。

在您的测试中,您验证您的测试代码(剪切)Firlst是否在其依赖项上调用了预期的方法,并根据为模拟的模拟配置的返回值调整了预期的参数和/或剪切的输出Second

答案 1 :(得分:3)

您正在通过模拟First来测试Second及其与Second的互动。这意味着您正在使用Second的虚拟版本,您可以在调用其方法时随意返回。

First不知道ThirdFourth的存在,所以根本不需要嘲笑它们。