4

我刚刚创建了一个Manager处理SuperClass在整个代码库中扩展并使用某种SuperClassManager( SCM) 注册的 a。

现在我想测试我Manager只知道SuperClass. 但是,我试图创建一个具体SCM的依赖于第三方库的库,因此在我的 jUnit 测试中没有做到这一点。现在的选项是模拟 this 的所有实例SCM

到目前为止一切都很好,但是,当我Manager处理 时SCM,它会返回SuperClassManager不知道或不关心的子项。然而,这些孩子的身份对我的测试(平等等)至关重要。

由于我不能使用具体的SCM,我必须模拟调用适当函数的结果SCM,然而,这意味着我的测试和(间接)我Manager需要了解和关心SuperClass.

检查代码库,我的测试似乎没有更合适的位置(已经维护了适当的实际依赖项)。

为了单元测试而引入不必要的依赖是否值得?


2012 年 12 月 18 日更新


这是我的问题的简化版本:

package some.package.declaration;

import some.open.source.framework.TopComponent;
import some.open.source.framework.WindowManager;

/**
 * Own source code.
 * Knows WindowManager and TopComponent; but no
 * direct child of TopComponent.
 */
class TopComponentManager{

  /**
   *
   */
  void efficientlyDoOperationsOnCurrentTopComponents(){
    Set<TopComponent> currentTopComponents = get all current TopComponents from WindowManager;
    Set<TopComponent> getNeededTopComponents(currentTopComponents);
    do some operations on the current TopComponents;
    ...
    ...
  }

  void Set<TopComponent> getNeededTopComponents(Set<TopComponent> givenTopComponents){
    Set<TopComponent> neededTopComponents = new HashSet<TopComponent>(givenTopComponents);
    disregard and keep some TopComponents based on controls;
    return neededTopComponents;
  }

}

package some.package.declaration.test;   // same project as TopComponentManager

import jmockit;
import some.open.source.framework.TopComponent;
import some.open.source.framework.WindowManager;

import own.source.code.childrenOfTopComponent.ChildTopComponent;  // Don't want to; need to introduce package dependencies
import own.source.code.childrenOfTopComponent.AnotherChildTopComponent;  // Don't want to; need to introduce package dependencies

class TopComponentManagerTest{

  @Tested
  TopComponentManager _topComponentManager;
  @Mocked
  WindowManager _windowManager;
  @Mocked
  ChildTopComponent _childTopComponent1;  //extends TopComponent; unknown to both TopComponentManager and TopComponentManagerTest
  @Mocked
  AnotherChildTopComponent _childTopComponent2;  //extends TopComponent; unknown to both TopComponentManager and TopComponentManagerTest

  Set<TopComponent> _currentTopComponents = new HashSet<TopComponent>();

  @Before
  void setUp() throws Exception {
    _currentTopComponents.add(_childTopComponent1);
    _currentTopComponents.add(_childTopComponent2);
  }

  void testgetNeededTopComponents(){

    Deencapsulation.invoke(_topComponentManager, "getNeededTopComponents", _currentTopComponents);

    new Verifications(){{
      verify that only _childTopComponent2 is returned;
    }};

  }

}

可以看出,在测试 TopComponentManager 时,我必须验证已确定的必要元素,这些元素在此包中是未知的。

4

4 回答 4

2

为什么不直接模拟TopComponent呢?

例子:

@Mocked
TopComponent _childTopComponent1;
于 2012-12-19T07:32:15.933 回答
0

不确定这是否是您正在寻找的,但Mockito 提供了一种在调用模拟方法时返回模拟的方法:

SCM scmMock = Mockito.mock(SCM.class, Mockito.RETURNS_MOCKS);
// scmMock.someMethod() will return a mock
于 2012-12-17T10:22:24.517 回答
0

也许如果您可以使用一些代码,那么给您答案会更容易。

另外,你怎么称呼SuperClassManager什么时候Manager才知道SuperClass?它是内部的依赖项SuperClass吗?如果是这种情况,则说明SuperClass存在错误的依赖关系,您应该考虑将其从SuperClass.

但是,如果您的经理不知道SCM,而只知道SuperClass,那么您应该模拟 ,SuperClass因为 的测试Manager不能依赖于其他组件的代码,并且您不应该创建不必要的依赖项。

于 2012-12-18T12:04:50.207 回答
0

我最终通过创建一个只包含我的测试类的新项目来解决这个问题。这个测试类依赖于散布在代码库中的TopComponentManager所有 child 。TopComponent但是,依赖关系不是问题。

使用这种方法,可以在该项目中实现更多测试,而不会对生产代码产生任何额外的依赖。

于 2012-12-21T04:53:18.063 回答