例如,要测试的类是
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?
...
}
}
我的问题如上文评论所述。
简而言之,如何模拟未注入但在待测试类中创建的变量?
提前感谢!
您的问题更多的是关于设计,您的类的设计是错误的,并且不可测试。为以前开发的方法和类编写单元测试并不容易(有时根本不可能(。事实上,TDD(测试驱动开发(的一大好处是它可以帮助开发人员以可测试的方式开发他们的组件。
如果测试是先写的,你的类就不会以这种方式开发。事实上,在为组件编写测试时,不可避免的一件事就是重构。因此,在这里,要将组件重构为可测试组件,您应该将工厂作为参数传递给类的构造函数。
localVariable怎么样:
这实际上取决于你的情况和你期望你的单位做什么(这里你的单位是doSomething
方法(。如果它是一个变量,是您从方法中提取出来作为其任务的一部分来创建的,并且应该在每次调用中基于方法中的一些逻辑来创建它,那么让它存在是没有问题的,但如果它为您的方法提供了一些其他逻辑,并且可以作为参数传递给您的类,那么您可以将它作为参数传递到类的cunstructor。
还有一件事,当你进行重构时要小心——会有很多其他组件使用你的组件,你应该一步一步地进行重构,你不应该改变方法的逻辑。
添加另一个视角:如果遇到必须测试给定类而不允许更改需要测试的类的情况,您可以选择使用PowerMock这样的框架(https://github.com/powermock/powermock)它提供了增强的模拟功能。
但请注意,仅为了证明难以测试的代码的合理性而使用PowerMock是不可取的。Tashkhisi的答案是迄今为止更好的通用方法。