如下图所示,有两种简单的方法可以使流式复印机(引入Apache Commons或类似软件).我应该去哪一个,为什么?
public class Streamcopier {
private int bufferSize;

public Streamcopier() {
    this(4096);
}

public Streamcopier(int bufferSize) {
    this.bufferSize = bufferSize;
}

public long copy(InputStream in,OutputStream out ) throws IOException{
    byte[] buffer = new byte[bufferSize];
    int bytesRead;
    long totalBytes = 0;
    while((bytesRead= in.read(buffer)) != -1) {
        out.write(buffer,bytesRead);
        totalBytes += bytesRead;
    }

    return totalBytes;
}
}

VS

public class Streamcopier {

 public static long copy(InputStream in,OutputStream out)
     throws IOException {
     return this.copy(in,out,4096);
 }

 public static long copy(InputStream in,OutputStream out,int bufferSize)
     throws IOException {
     byte[] buffer = new byte[bufferSize];
     int bytesRead;
     long totalBytes = 0;
     while ((bytesRead= in.read(buffer)) != -1) {
         out.write(buffer,bytesRead);
         totalBytes += bytesRead;
     }

     return totalBytes;
}
}

解决方法

我将使用非静态(实例)版本,并将其作为与setter的显式依赖关系提供给消费者:

嘲笑它进行单元测试是微不足道的,所以对消费者的测试并不适用于实施;
交换功能很简单,例如:使用子类;
>依赖注入系统很好地工作.

编辑

在回答“有用的!”评论“这是如何帮助嘲笑”的时候,这是如何工作的:

class ThingThatUsesstreamcopier {

    // our copier instance. set in constructor,but might equally use
    // a setter for this:
    private Streamcopier copier;

    public ThingThatUsesstreamcopier(Streamcopier copier) {
        this.copier = copier;
    }

    public void makecopy(Stream in,Stream out) {
        // probably something a little less trivial...
        copier.copy(in,out);
    }
}

当我来测试ThingThatUsesstreamcopier时,我可以创建一个mock object版本的Streamcopier,并使用这个模拟实例化ThingThatUsesstreamcopier.

通过这样做,我完全控制了我的模拟行为,所以我的测试与Streamcopier的任何实际实现脱钩.我只是测试消费者,而不是消费者加消费.

java – 对象与静态方法的设计的更多相关文章

  1. ios – 两个类,回调和单元测试

    而且,我不觉得这样的行为会很容易测试?

  2. php – 为什么静态方法是不可测的?

    为什么静态方法是不可测的?举例说明(如果可能的话PHP).静态方法本身不是不可测试的,但如果被测试的对象调用静态方法,那么测试不能“进入”,而是调用存根方法.如果正在测试的对象调用一个常规的方法,测试可以给它一个替代对象,该方法的存根实现.一般来说,严格的依赖关系是可测试的,而依赖注入(googleit)使代码更具可测试性.例如,假设我们有一个静态方法getCurrentUser()被我们正在测试

  3. php – 测试函数是否从静态上下文运行

    我正在编写一个PHP类,并且包含了一些静态函数,可以快速访问,因为它们很常用,功能也很简单.但是,他们确实使用其中的对象进行数据库访问.我可能会在整个代码中使用静态和非静态上下文中的这些静态方法,因此我希望能够测试是从静态或非静态上下文调用该函数,以便我可以避免创建重复的对象如果从非静态上下文调用该函数(此实例对象和要静态使用的函数中的实例对象).有没有什么方法可以在函数中测试它,以便我可以使用实

  4. java – Espresso 2.0 – 在扩展junit3 testcase的类中使用@Test注释的方法

    当使用Espresso2.0附带的新ActivityInstrumentationTestCase2类时,我得到了一个奇怪的警告方法,使用@Test内部类扩展junit3testcase.我的课程看起来就像谷歌提供的那样:我已经为build.gradle添加了所有必要的东西:有没有办法让这个警告消失?解决方法ActivityInstrumentationTestCase2是一个JUnit3测试用例

  5. javascript – 如何用Jasmine窥探静态类方法

    我有一个静态方法的类,我想在Jasmine中测试.我知道静态方法不能在类的实例上调用.所以除了找不到spyOn的方法之外,我的测试没有通过,但是如何用Jasmine在类中测试静态方法呢?茉莉花测试解决方法你应该能够使用spyOn使它成为间谍.间谍也不是要直接测试–它们是一种工具,因此您可以更加确定地并且孤立地测试其他代码.

  6. java – 对象与静态方法的设计

    如下图所示,有两种简单的方法可以使流式复印机.我应该去哪一个,为什么?VS解决方法我将使用非静态(实例)版本,并将其作为与setter的显式依赖关系提供给消费者:嘲笑它进行单元测试是微不足道的,所以对消费者的测试并不适用于实施;交换功能很简单,例如:使用子类;>依赖注入系统很好地工作.编辑在回答“有用的!”

  7. java – @BeforeClass vs static {}

    我在使用JUnit编写一些测试用例.我需要初始化一些静态变量,这些变量将用于该类中的所有测试用例.为此,我可以使用>静态初始化程序块或>@BeforeClass的静态方法使用一个以上的优点是什么?

  8. java – 如何单元测试Spring ResourceHandlerRegistry提供的静态资源

    我正在尝试对一个新的SpringMVC项目进行单元测试.我有一个服务于index.jsp的家庭控制器的通过测试.我正在尝试在WebConfig中测试由ResourceHandlerRegistry提供的静态资源.有关如何正确执行此操作的任何提示?以下是我的代码:print()的输出:解决方法使用标准配置如果你执行get“/resources/css/test.css”而不是“resources/c

  9. 将C库与Haskell库静态链接

    安装程序:我有一个Haskell库HLib,调用C/C++后端CLib以提高效率.后端小,专门用于HLib.与CLib的接口只能通过HLib暴露;HLib测试,HLib基准测试和依赖于HLib的第三方库不会直接对CLib进行FFI调用.从测试/基准/第三方lib的角度来看,HLib应该纯粹是Haskell.这意味着在例如HLib测试的cabal文件部分中,应该没有对-lCLib,libCLib等的

  10. java – pathParameters文档异常(urlTemplate未找到)

    当使用pathParameters来记录URI路径参数时,如下所示我得到以下的兴趣我很确定我做了测试设置,如解释here.我可能做错了什么?

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部