首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mockito和界面事件

Mockito和界面事件
EN

Stack Overflow用户
提问于 2016-02-01 22:39:35
回答 3查看 576关注 0票数 1

我正在使用mockito编写集成测试。被测单元通过接口连接到模拟对象(objA)。当被模仿的对象触发一个事件,而被测试的单元正在监听它时,我试图模仿的功能就会发生。

接口:

代码语言:javascript
复制
public interface MyInterfaceAPI{
   void fireyMyEvent(String msg);
}

被测单元:

代码语言:javascript
复制
public class UnitUnderTest{

    ObjA objA;

    public UnitUnderTest(ObjA objA_t) {
         objA = objA_t;
         objA.addMyListener(new addMyHandler()); 
    }

    class addMyHandler implements MyInterfaceAPI{
       @Override
       public void fireyMyEvent(String msg) {
             System.out.println(msg);
       };
    };
};

测试:

代码语言:javascript
复制
 public class MyTest {

     @org.junit.Test
     public void run() {

         ObjA  mockObjA = mock(ObjA .class);    
         UnitUnderTest spyController = Mockito.spy(new UnitUnderTest());

         MyInterfaceAPI mo2uut= mock(MyInterfaceAPI.class);
         mo2uut.fireyMyEvent("hello from test"); 
     }
 }

我的问题是在测试中,如何将mo2uut (‘模拟对象’到‘被测单元’)连接到UnitUnderTest中MyInterfaceAPI的addMyHandler类实现?

我显然遗漏了一些东西,但我不确定是什么。

EN

回答 3

Stack Overflow用户

发布于 2016-02-01 23:34:58

你有两个关于单元测试的学校:伦敦/ Mockist学校和底特律学校。

如果你想使用mock,你必须使用依赖注入,所以你可以用mock替换依赖。我认为大多数关注底特律学派的人也会同意这一点,因为使用依赖注入“是一件好事”(tm)。

您可以做的是在构造函数中将ObjA的实例传递给UnitUnderTest;或者(如果ObjA是一个集合)添加UnitUnderTest.addListener()方法,在该方法中传递处理程序的实例。使用这两种方法,您将注入一个处理程序。

关于使用powermock: Powermock是一种更好的工具,用于单元测试很少且依赖关系混乱的旧项目。如果你现在正在编码,使用power mock是错误的(本着公平的精神,这是一个有偏见的想法,但它与许多其他人分享)。

编辑

现在我明白你的问题了!我认为你试图在一个单元测试中测试太多,这就导致了问题。再一次,嘲笑学派谈到了测试交互。这就是关键点。因此,在UnitUnderTest的测试中,惟一的交互是与ObjA设置处理程序,这就是故事的结尾。

您可能需要对ObjA进行另一个测试,以确保所有处理程序都被调用。

现在,最后一部分是如何测试处理程序的代码。但在此之前,请理解每个测试的独立性,因为您正在测试交互(以及代码中的任何逻辑),但不要超过一件事情。关于训练员..。您可能不喜欢这样,但您必须使该类可访问,要么将其设置为公共类,要么将其提取到另一个公共类。如果您将其解压缩,则可以将其放入一个internal包中,这样就可以清楚地看出这个类不应该被其他任何人使用。

如果您有一个小时的空闲时间,我建议您观看这个优秀的演示文稿:The Deep Synergy Between Testability and Good Design by Michael Feathers,他在其中介绍了一个类似的示例,说明了您的代码中有哪些内容,以及为什么将其分离是有意义的。

票数 2
EN

Stack Overflow用户

发布于 2016-02-01 22:51:01

使用PowerMockPowerMockito拦截对addMyHandler类的调用,注入一个模拟的MyInterfaceAPI,如Ben Kiefer关于"PowerMockito: Constructor Mocking"的教程中所述

票数 1
EN

Stack Overflow用户

发布于 2016-02-02 01:19:12

我已经设法让它工作了。在这里发布修复代码,供将来看到此内容的人使用。

代码语言:javascript
复制
public interface MyInterfaceAPI{
   void fireyMyEvent(String msg);
}

被测单元:

代码语言:javascript
复制
public class UnitUnderTest{

  private ObjA objA;
  public MyInterfaceAPI interfaceHandler;

  public UnitUnderTest(ObjA objA_t) {
     objA = objA_t;
     interfaceHandler = new addMyHandler();
     objA.addMyListener(interfaceHandler); 
  }

  class addMyHandler implements MyInterfaceAPI{
    @Override
    public void fireyMyEvent(String msg) {
         System.out.println(msg);
    };
  };
};

测试:

代码语言:javascript
复制
public class MyTest {

 @org.junit.Test
 public void run() {

     ObjA  mockObjA = mock(ObjA .class);    
     UnitUnderTest spyController = Mockito.spy(new UnitUnderTest());
     spyController.hnd.fireyMyEvent("hello from test"); 
 }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35133263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档