如何模拟在类内而不是在任何成员函数内实例化的对象

时间:2018-10-12 10:47:35

标签: unit-testing junit kotlin mockito

假设我们有一个这样的类:-

class A {
internal val obj : Obj      
     get() = Application.getbean(Obj::class) 
fun method1(){
val result = obj.somefunc()
..../code/
  }
fun method2(){
...../code/
  }
}

我不想使用junit嘲笑框架来编写单元测试来测试method1的功能,也不想嘲笑obj对象。在stackoverflow上的其他一些线程中,人们建议使用注入的构造函数依赖关系,但由于循环依赖关系的问题,在我的情况下这是不可能的。在其他一些答案中,人们建议将对象实例化移动到方法中,但我不想那样做。有没有办法模拟此obj对象。

1 个答案:

答案 0 :(得分:0)

以不可测试的方式编写的代码很难进行单元测试。这就是为什么您应该注入依赖性而不是保留它们的原因,这就是为什么您应该获取对象而不是自己创建它们的原因。如果您假设您的代码可能已经过测试,请始终考虑如何进行测试。

在您的情况下,模拟Obj有点困难,但并非不可能,因为对象的实际创建(构造函数调用)是使用不同的类(而不是被测试的类)完成的。

在您的示例中,您使用的是静态方法,也许您可​​以使用PowerMockito模拟其行为?请看看这个answer

除此之外,我只能建议更改代码。 要将对象创建类作为依赖项注入或使用其他方法,这可能涉及一些体系结构更改。