【问题标题】:Partial mocking on class that do not follow SOLID principles (especially Dependency Injection)对不遵循 SOLID 原则的类进行部分模拟(尤其是依赖注入)
【发布时间】:2017-01-18 17:30:21
【问题描述】:

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

另外,仅仅为了对我的代码进行单元测试而在 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;
  }
}

【问题讨论】:

  • 如果 x.something() 返回 void,那你为什么要模拟它的内部行为呢?如果您只是打算测试 A 类,那么 X 的内部是无关紧要的。也许您真的想测试类 X 及其 doSomethins() 方法的行为?

标签: java unit-testing junit mocking powermock


【解决方案1】:

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

在这种情况下,将单元测试放在与Y 类和测试类X 相同的包中(因为你必须从X 类中删除final 关键字):

@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*/);  
}

【讨论】:

    猜你喜欢
    • 2015-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-17
    • 1970-01-01
    • 2017-11-26
    • 1970-01-01
    相关资源
    最近更新 更多