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

相关推荐

    Mock模拟测试使用

    在使用Mock对象时,可以通过设置预期来规定方法应该被调用的次数、传递的参数以及应返回的结果。这样可以在测试中确保代码的行为符合预期。 ##### 2.4、验证预期的结果 验证是指在测试完成后检查Mock对象的行为是否...

    单元测试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...

    jMock基本使用方法

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

    第六章 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开发中扮演着多种角色,包括...

Global site tag (gtag.js) - Google Analytics