【发布时间】:2011-04-08 09:34:11
【问题描述】:
我有一个 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);
....
}
【问题讨论】:
-
我问你为什么要这样做?您最终可能会测试错误的代码。如果内部类具有依赖项(可能通过控制器获得?)模拟那些。等待?你的代码编译了吗?如果 Wrapper 是私有类,你可以将它用作公共方法的参数吗?
-
@Martinho Fernandes 我是测试新手。我只是想对 save 方法进行测试,所以我需要模拟 Wrapper 对象,以便在对其调用某些方法时定义返回对象。是的,控制器编译(测试没有,但这是问题 - 我不能在测试中使用 Wrapper 类)。也许有更好的方法来做到这一点。
-
Java 再次让我感到惊讶(负面的)。如果手头没有 Java 编译器,这让我无能为力:( 无论如何,即使允许,我认为拥有一个需要私有知识的公共方法不是一个好的设计。它破坏了封装。你打算怎么做在实际的真实代码中使用该方法?有可能吗?
-
@Martinho Fernandes 你说得对,我想我会把它改成公开的
标签: java unit-testing spring-mvc mocking mockito