0 0

对于public方法中调用多重private方法应该如何mock0

假如有如下方法
public void publicMethod()
{
    if(condition1)
        privateMethod1();
    else
        privateMethod2();          
}

private void privateMethod1()
{
    ......
    privateMethod3();
}

private void privateMethod2()
{
    ......
    privateMethod4();
}


在上述私有方法中,可能会依赖很多的外部类,并且可能会有多重分支,这样的话以publicMothod做为入口,并且mock私有方法中依赖的所有的外部类行为来进行测试,将会非常麻烦,并且分支都是级数级的。请问这种情况大家都是如何进行单元测试的?
2013年4月17日 09:50

3个答案 按时间排序 按投票排序

0 0

采纳的答案

单元测试的重点是“单元”,所以测试对象不应过大,而应该尽量小而且职责应该单一。
如果测试对象过大或者过于复杂,则说明设计存在问题,需要重构,这正是单元测试的宗旨和目标————促进重构改善设计。

这里private里面调用了多个外部类,应该尽量简化,同时每个调用的外部类方法也应该是单独进行测试的。
另外,如果你重构之后还是需要测试这个private方法,可以把它改成protected,然后单元测试类继承这个类,就可以进行测试了,因为子类是可以访问父类的protected方法的。

向LZ推荐一本单元测试的书————JUnit.Recipes(JUnit菜谱)。书中讲了N多中单元测试中的技巧和解决方案,非常实用,建议一览,会有恍然大悟之感。书里讲的那些技巧非常巧妙,有些你可能在实践中曾经自己发现过并引以为豪,但是看了这本书,你会发现它里面已经罗列出来了,我就曾有这种经历。


下面这是网上转来的,说的还是有一定道理的:
如何对private方法进行单元测试
问:如何对私有方法进行单元测试?
答:重点在于,你不应该有任何方法是从一开始设计出来就是private的,因为你的每段程序都应该在单元测试的驱动之下产生,而测试是不可能驱动出 来一个private方法的。那么private方法从哪里来?只能从重构而来。所以答案是:private方法是不需要测试的,因为它是重构的产物,而 重构是不改变程序可观察之行为的。既然行为不改变,测试自然也不需要有任何改变,所以不需要针对private方法建立任何新的测试。
问:但是,如果private方法确实出现问题了怎么办?如果确实希望用测试来弄清一个private方法里面到底发生了什么,该怎么办?
答:如果一个private方法复杂到你不能一眼看清它,那它就太复杂了,你应该把它重构成为一个独立的class,然后针对这个class来建立单元测试。

2013年4月17日 10:15
0 0

1. 对私有方法的测试, 有两种方法是. 第一: 把权限级别改为包级别. 第二: 通过反射. 我一般用第一种方式.

2. 关于测试依赖的问题. 如果累A方法a(也就是A.a)依赖一个外部组件的B的方b(也就是B.b), 通常我会把对B.b的调用抽取为一个A的一个方法c:
  private void c (){
     B.b();
  }

然后把c  mock掉.

2013年4月19日 00:32
0 0

PowerMock 可以

包级别 也行

2013年4月17日 09:56

相关推荐

    单元测试MockBean和SpyBean的简单用法

    下面将详细介绍MockBean和SpyBean的使用方法及其在单元测试中的作用。 **MockBean** MockBean是Spring Boot提供的一个注解,用于在测试环境中注入模拟对象。在测试中,我们可能不希望真实的依赖项执行其实际行为,...

    利用PowerMock模拟静态方法和私有方法的示例

    对于私有方法,由于其访问修饰符限制,正常情况下外部类无法直接调用。在单元测试中,我们通常不直接测试私有方法,而是通过测试公有方法来间接验证私有方法的正确性。然而,有时私有方法包含了复杂的逻辑,为了确保...

    0积分:Mock对象教程

    为了解决这一难题,引入了Mock对象的概念,一种在单元测试中模拟真实对象行为的策略,旨在减少对外部依赖的直接调用,提升测试的隔离性和效率。 #### Mock对象的概念与优势 在电影制作中,替身演员(stand-ins)...

    spring-mock.jar

    本文将详细探讨Spring Mock的核心概念、使用方法以及它在实际开发中的价值。 一、Spring Mock简介 Spring Mock是Spring框架的一个扩展,它允许开发者在测试过程中创建和配置模拟对象,以代替真实的依赖,从而减少...

    Mock初学教程

    在某些情况下,我们可能希望定义方法调用时的参数应该满足某种条件,而不是固定值。这时可以使用`ArgumentMatcher`。 **定义ArgumentMatcher** ```java public static class NameMatcher implements ...

    Mock.java.zip

    接着,可以使用`@Mock`注解创建Mock对象,`@InjectMocks`注解来注入这些Mock对象到被测试类中,最后通过`when()`和`thenReturn()`等方法来指定Mock对象的行为。 例如,假设我们有一个`UserService`类依赖于`...

    转:google mock C++单元测试框架-奋飞的菜鸟-ChinaUnix博客1

    Mock 对象能够模拟真实对象的行为,并且可以预设它们在特定调用下的响应,这对于隔离测试和验证特定功能的正确性非常有用。 在 Google Mock 中,主要涉及以下几个核心概念: 1. **匹配器(Matchers)**:匹配器...

    springboot搭建mock

    在IT行业中,Mock技术是一种非常重要的测试方法,它允许开发者模拟复杂的系统组件或者外部依赖,以便在不实际运行这些组件的情况下进行单元测试或集成测试。SpringBoot作为一个流行的Java开发框架,提供了构建微服务...

    mock对象介绍

    - 当测试需要验证某些方法是否被正确调用时。 - 当真实对象不存在时,例如与其他团队的接口尚未完成。 #### 三、Mock对象的使用步骤 使用Mock对象进行单元测试时,主要遵循三个步骤: 1. **定义接口**:首先定义...

    Autofac 集成测试 在 ConfigureContainer 之后进行 Mock 注入.rar

    标题中的“Autofac 集成测试 在 ConfigureContainer 之后进行 Mock 注入”涉及到的是在.NET 开发中使用Autofac容器进行依赖注入时,如何在集成测试中模拟(Mock)服务。Autofac是一个流行的IoC(Inversion of ...

    JMockit学习分享

    - **Replay**:在测试中调用记录的方法。 - **Verify**:验证方法调用的次数和顺序等。 4. **高级mock功能**: - 支持私有成员和静态方法的模拟。 - 自动注入mock对象。 - 使用`anyXxx`、`withXxx`等关键字简化...

    feign-mock:一种简单的测试https的方法

    该项目的内容已捐赠项目,现在可以作为Feig的一部分使用。 假装 一种简单的测试。 由于伪装将大多数逻辑存储在批注中,因此这有助于检查批注是否正确。... public void setup() throws IOException

    spring集成TestNG与Mockito框架单元测试方法

    在实际项目中,你可能还需要使用`@Spy`注解创建部分模拟对象,或使用`verify`方法检查方法是否被正确调用。同时,可以结合Spring的`@Autowired`和`@Qualifier`注解来处理多bean注入的情况。 通过这样的方式,Spring...

    第六章 Spring4 方法替换

    对于Groovy开发者,Spock框架提供了一种优雅的方式来编写测试,包括方法的替换。Spock允许你使用`when:`、`then:`块来定义方法的行为和预期结果,非常直观易读。 6. **Spring TestContext Framework**: Spring的...

    Spring Boot与MyBatis结合 实现对mock平台改造

    在IT行业中,Mock平台是一种非常重要的工具,它允许开发者在真实环境尚未准备好或者不适宜进行测试时,模拟接口数据,以便于快速进行开发和测试。本篇将详细讲解如何使用Spring Boot与MyBatis框架结合,对Mock平台...

    Mockito的重要入门资料

    - **验证方法调用**:使用`verify()`方法验证mock对象的方法是否被正确调用。 - **验证调用次数**:结合`times()`或`atLeast()`, `atMost()`等限定符来验证方法被调用的次数。 - **验证调用顺序**:使用`InOrder`类...

    【ASP.NET编程知识】通过HttpClient 调用ASP.NET Web API示例.docx

    在本文中,我们将学习如何使用 HttpClient 调用 ASP.NET Web API。HttpClient 是一个强大的 HTTP 客户端库,能够发送 HTTP 请求并接收响应。在 ASP.NET Web API 中,我们可以使用 HttpClient 来调用 Web API,以便...

    asp.net 接口(interface)例子

    通过接口,我们可以创建模拟对象(Mock Object)或存根对象(Stub Object),以便在单元测试中替换实际依赖,从而专注于测试单个类的行为,而不是整个系统。 综上所述,接口在ASP.NET开发中扮演着多种角色,包括...

    jMock基本使用方法

    - **期望行为**:在 jMock 中,可以通过配置模拟对象来指定它在特定方法调用时的预期行为,比如返回值或抛出异常等。 - **验证**:测试完成后,可以验证模拟对象的方法是否按照预期被调用,以此来确认被测对象的行为...

Global site tag (gtag.js) - Google Analytics