繁体   English   中英

Java单元测试中,如何mock待测类内部未注入但创建的变量?

[英]In Java unit testing, how to mock the variables that are not injected but created inside the to-be-tested class?

例如,要测试的类是

public class toBeTested {
    private Object variable;

    public toBeTested(){
        variable = someFactory();         // What if this someFactory() sends internet request? 
                                          // Can I mock "variable" without calling 
                                          // someFactory() in testing?
    }

    public void doSomething(){
        ...
        Object returnedValue = variable.someMethod();  // In testing, can I mock the behavior of 
                                                       // this someMethod() method when 
                                                       // "variable" is a private instance 
                                                       // variable that is not injected? 
        
        Object localVariable = new SomeClass();        // Can I mock this "localVariable" in 
                                                       // testing?
        ...
    }
}

我的问题如上述评论中所述。

简而言之,如何mock待测类内部未注入但创建的变量?

提前致谢!

您的问题更多是关于设计的,您的类的设计是错误的并且不可测试,为之前开发的方法和类编写单元测试并不容易(有时根本不可能) . 实际上,TDD(测试驱动开发)的一大好处是它可以帮助开发人员以可测试的方式开发他们的组件。

如果首先编写测试,您的类就不会以这种方式开发。 事实上,当你为你的组件编写测试时,你应该做的一件不可避免的事情就是重构。 因此,在这里要将您的组件重构为可测试的组件,您应该将 factory 作为参数传递给类的构造函数。

那么 localVariable 呢:

这实际上取决于您的情况以及您期望您的单位做什么(这里您的单位是doSomething方法)。 如果它是您从方法中 expext 创建作为其任务的一部分的变量,并且应该根据每次调用中方法中的某些逻辑创建它,那么让它在那里没有问题,但是如果它提供了一些其他逻辑您的方法并且可以作为参数传递给您的类您可以将其作为参数传递给您的类的 cunstructor。

还有一点,在重构的时候要小心,会有很多其他的组件在使用你的组件,你应该一步一步地重构,不要改变你方法的逻辑。

添加另一个观点:如果遇到必须测试给定类并且不允许更改需要测试的类的情况,您可以选择使用像 PowerMock 这样的框架( https://github.com /powermock/powermock )提供增强的模拟功能。

但请注意,将 PowerMock 用于证明难以测试代码的唯一目的是不可取的。 Tashkhisi 的答案是迄今为止更好的通用方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM