java - 如何模拟私有(private)内部类

标签 java unit-testing spring-mvc mocking mockito

我有一个 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/

相关文章:

javascript - Jasmine 单元测试具有两个依赖项的 AngularJS 工厂($http 和另一个返回 promise 的工厂)

JavaScript 无法运行,说元素为空,但代码在 fiddle 中运行

spring-mvc - 使用 Kotlin 数据类在 Spring @RequestMapping 注释方法中对路径变量进行分组

java - ASM 3.3.1 中缺少 ASMifier 类

java - 在 Hibernate/JPA 中将货币存储为 BigDecimal -decimal(19,2)

javascript - 在 WebStorm 中通过断言的测试失败

java - 使用 html 页面而不是 jsp 页面时出现错误

java - 简单的java布局问题

java - Java 中的高效 Zip 文件流

java - 在 ANT 构建工具中设置系统变量并使用 Syste.getEnv ("ABC_HOME"在 Java 中读取它)