如何创建私人内部阶级


问题内容

我有一个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);
    ....
}

问题答案:

您的测试是针对方法的,但它会测试整个类的行为。如果您的内部类是私有的,则其实现细节。测试不应该知道的东西。该内部类中有很多行为,您想独立对其进行测试,也许您应该将其公开并与此类分开。

也许您认为:但是然后…要测试的代码很多(这是一件非常大的不可分割的事情),我不能测试较小的东西吗?嗯,是。测试驱动开发的要求是最小化实现并仅在添加更多测试时添加更多代码。因此,您将从一些测试和最小的实现入手,然后对它们进行改进,直到测试具有所有的规范和所有实现的代码。

因此,不必担心私有内部类。测试您的班级合同!