如何模拟私有内部类

时间:2011-04-08 09:34:11

标签: java unit-testing spring-mvc mocking mockito

我有一个spring应用程序,我想在像这样的控制器上创建一个单一的测试。问题是Wrapper类是一个私有内部类,因此在测试中不了解Wrapper。是否可以在不更改控制器类的情况下使用Mockito进行模拟。我可以使用prepareData()来获取对象的实例,但我不知道是否可以使用它来模拟该对象。

由于

@Controller
public class Controller {

    private class Wrapper {
        private Object1 field1;
        private Object2 field2;
        private Object1 method1(){
           ...
        }
        private Object2 method1(){
           ...
        }
    }

    @ModelAttribute("data")
    public Wrapper prepareData() {
            return new Wrapper ();
}

    public String save(@ModelAttribute("data") Wrapper wrapper, BindingResult result, Model model){
        ...
    }
}

所以在我的测试中,我会有类似的东西

@Test
public void usernameEmpty(){

    BindingResult result = Mockito.mock(BindingResult.class);
    Model model = Mockito.mock(Model.class);
    Wrapper data = //how to mock it
    when(data.method1()).then(new Foo1());
    when(data.method2()).then(new Foo2());
    String returned = controller.save(data, result, model);
    ....
}

1 个答案:

答案 0 :(得分:8)

您的测试是针对方法的,但它会测试整个类的行为。如果您的内部类是私有的,那么它是一个实现细节。测试不应该知道的东西。在那个内部类中有很多行为,你想要独立地测试它,也许你应该把它公开并与这个类分开。

也许你会想:但是......那是很多要测试的代码(一个非常大的不可分割的东西),我不能测试更小的东西吗?嗯,是。测试驱动开发要求仅在添加更多测试时才进行最小化实施并添加更多代码。所以你从一些测试和最小的实现开始,然后发展它们,直到测试具有所有规范和代码的所有实现。

所以不要担心私人内部课程。测试你的课程合同!