我有一个示例类“ A”,正在进行单元测试。我需要规定类“ X”的行为,以便它给我一个我在单元测试中指定的随机数,而不是一个生成的值。我不确定应该模拟哪个类,我需要具有X的行为,除了它从抽象类“ Y”继承的方法“ getGen()”之外,或者我有其他方法可以做什么我想要做。

另外,仅仅为了单元测试我的代码而重写类X中的“ getGen()”是多么愚蠢的想法?还是我的代码无法测试?

测试A级:

class A {
   public Type method(Typ1 a) {
      //do something
      X x = new X(a, String a);
      x.doSmething();
      //do something?
   }
}


X级:

final class X extends Y {
   Typ1 t;
   String x;
   X(Typ1 t, String x) {
   this.t = t;
   this.x = x;
   }
   public void doSomething() {
      int x = getGen().method(x);
      //do something
   }
}


抽象类y:

abstract class Y {
  Obj getGen(){
    return someInstanceOfObj;
  }
}


对象类:

class Obj {
  int method(){
    return someNumber;
  }
}

最佳答案

您省略了几乎所有可见性修饰符,所以我假设所有都是package private except doSomething()`。

在这种情况下,您要在与类Y相同的程序包中进行单元测试,并测试类X(因此,必须从类final中删除​​X关键字):

@Test
public void doSomething_delegatesToObj(){
   // arrange
   X x = Mockito.spy(new X());
   Obj o = mock(Obj.class);
   doReturn(o).when((Y)x).getObj(); // must be in same package as Y for this.

   // act
   x.doSomething();

   // assert
   verify(o).method(/*not sure what belongs here*/);
}

关于java - 不遵循SOLID原理的类的部分 mock (尤其是依赖注入(inject)),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41725821/

10-10 17:07