我有一个 spring 应用程序,我想在像这样的 Controller 上创建一个单一测试。问题是Wrapper类是private内部类,所以在测试中不理解Wrapper。是否可以在不更改 Controller 类的情况下使用 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);
....
}
最佳答案
你的测试是针对方法的,但它测试了整个类的行为。如果您的内部类是私有(private)的,那么它是一个实现细节。测试不应该知道的东西。如果该内部类中有很多行为,并且您想独立测试它,也许您应该将其公开并与此类分开。
也许你会想:但是……要测试的代码很多(一个非常大的不可分割的东西),我不能测试一些更小的东西吗?嗯,是。测试驱动开发要求进行最少的实现,并且仅当您添加更多测试时才添加更多代码。因此,您从一些测试和最小实现开始,然后对它们进行改进,直到测试具有所有规范并且代码具有所有实现。
所以不用担心私有(private)内部类。测试你的类(class)契约!
关于java - 如何模拟私有(private)内部类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5593201/