相关疑难解决方法(0)

如何测试私有函数或具有私有方法,字段或内部类的类?

如何对具有内部私有方法,字段或嵌套类的类进行单元测试(使用xUnit)?或者通过内部链接(static在C/C++中)或在私有(匿名)命名空间中使其成为私有的函数?

为了能够运行测试而更改方法或函数的访问修饰符似乎很糟糕.

java tdd unit-testing

2593
推荐指数
36
解决办法
82万
查看次数

在C#中测试私有方法的单元

Visual Studio允许通过自动生成的访问器类对私有方法进行单元测试.我编写了一个成功编译的私有方法的测试,但它在运行时失败了.一个相当小的代码和测试版本是:

//in project MyProj
class TypeA
{
    private List<TypeB> myList = new List<TypeB>();

    private class TypeB
    {
        public TypeB()
        {
        }
    }

    public TypeA()
    {
    }

    private void MyFunc()
    {
        //processing of myList that changes state of instance
    }
}    

//in project TestMyProj           
public void MyFuncTest()
{
    TypeA_Accessor target = new TypeA_Accessor();
    //following line is the one that throws exception
    target.myList.Add(new TypeA_Accessor.TypeB());
    target.MyFunc();

    //check changed state of target
}
Run Code Online (Sandbox Code Playgroud)

运行时错误是:

Object of type System.Collections.Generic.List`1[MyProj.TypeA.TypeA_Accessor+TypeB]' cannot be converted to type …
Run Code Online (Sandbox Code Playgroud)

c# unit-testing

265
推荐指数
10
解决办法
19万
查看次数

什么是C#相当于朋友?

可能重复:
为什么C#不提供C++风格的'friend'关键字?

我希望类的私有成员变量可以被Tester类访问,而不会将它们暴露给其他类.

在C++中,我只是将Tester类声明为朋友,如何在C#中执行此操作?有人能举个例子吗?

c#

175
推荐指数
5
解决办法
19万
查看次数

我可以使用VS2010 PrivateObject来访问静态类中的静态字段吗?

是否可以使用VS2010单元测试类PrivateObject访问静态类中的私有静态字段?

假设我有以下课程:

public static class foo
{
    private static bar;
}
Run Code Online (Sandbox Code Playgroud)

我可以使用PrivateObject创建foo的副本,然后获取bar字段吗?

.net c# visual-studio-2010

19
推荐指数
3
解决办法
7746
查看次数

TDD:您为单元测试公开了哪些方法?

TDD的一个方面我从未完全理解.

假设有人要求您实现一个简单的Stack对象.如果您已经正确完成了设计,那么您将获得一个非常简洁的API.假设:push(),pop()isEmpty().除此之外的任何事情都会过度消耗需求,并让用户有太多空间来捣乱您的代码.

所以现在让我们假设您要对代码进行单元测试.如果您所有的公共方法都只是上面显示的三个方法,那么您如何做到这一点?到目前为止,这些方法只会进行测试.

因此,要么添加私有方法,它们根本不会帮助您,因为它们对您的单元测试用例不可见.或者你将这些方法公之于众,那就是你努力工作的简约API.现在用户将要乱用你的堆栈,肯定会出现错误.

您如何处理打开公共测试方法与干净简单API的这种困境?

编辑:只是为了指向正确的方向,获得技术指针(例如"使用此hack来暴露私有方法"等等)会很高兴但是我对更通用的答案更感兴趣这两个概念更重要,以及您如何处理这个主题.

testing tdd unit-testing

16
推荐指数
2
解决办法
1886
查看次数

单元测试私有代码

我目前正在使用C#进行开发 - 这里有一些背景知识:我们用我们的客户端应用程序实现MVP,并且我们有一个循环规则,它规定没有方法应该具有大于5的圈复杂度.这会导致许多小的私有方法这通常是一件事.

我的问题是关于单元测试一个类:

通过公共方法测试私有实现都很好......我没有遇到实现这个问题的问题.

但是......以下情况如何:

示例1.处理异步数据检索请求的结果(回调方法不应仅供公开测试)

示例2.执行操作的事件处理程序(例如更新View标签的文本 - 我知道的愚蠢示例......)

示例3.您正在使用第三方框架,该框架允许您通过覆盖受保护的虚拟方法进行扩展(从公共方法到这些虚拟方法的路径通常被视为黑盒编程,并且将具有框架提供的各种依赖性你不想知道)

上面的例子在我看来并不是设计不佳的结果.他们似乎也没有成为单独进行单独测试的候选人,因为这样的方法会失去他们的背景.

没有人对此有任何想法吗?

干杯,杰森

编辑: 我认为我在原始问题中不够清楚 - 我可以使用访问器测试私有方法,并使用TypeMock模拟调用/方法.那不是问题.问题是测试不需要公开或不公开的东西.

我不想为了测试而公开代码,因为它可能会引入安全漏洞(只发布一个接口来隐藏它不是一个选项,因为任何人都可以将对象强制转换回其原始类型并获取访问权限我不希望他们)

被重构到另一个类进行测试的代码很好 - 但可能会失去上下文.我一直认为让'辅助'类可以包含一堆没有特定上下文的代码是不好的做法 - (在这里思考SRP).我真的不认为这适用于事件处理程序.

我很高兴被证明是错的 - 我只是不确定如何测试这个功能!我一直认为,如果它可以破坏或改变 - 测试它.

干杯,杰森

c# testing methods tdd private

15
推荐指数
3
解决办法
5559
查看次数

在正在测试的同一个类中模拟私有方法

我有一个名为的Java类MyClass,我想用JUnit进行测试.methodA我要测试的公共方法调用私有方法methodB,在同一个类中确定要遵循的条件路径.我的目标是为不同的路径编写JUnit测试methodA.此外,methodB调用服务,所以我不希望它在运行JUnit测试时实际执行.

模拟methodB和控制其返回的最佳方法是什么,以便我可以测试'methodA'的不同路径?

我更喜欢在编写模拟时使用JMockit,所以我对任何适用于JMockit的答案都特别感兴趣.

这是我的示例类:

public class MyClass  {

    public String methodA(CustomObject object1, CustomObject object2)  {

        if(methodB(object1, object2))  {
            // Do something.
            return "Result";
        }

        // Do something different.
        return "Different Result";

    }

    private boolean methodB(CustomObject custObject1, CustomObject custObject2)  {

        /* For the sake of this example, assume the CustomObject.getSomething()
         * method makes a service call and therefore is placed in this separate
         * method so that later an …
Run Code Online (Sandbox Code Playgroud)

java junit unit-testing jmockit mocking

14
推荐指数
2
解决办法
4万
查看次数

单元测试私有方法是一种好习惯吗?

我想知道单元测试私有方法是否是一个好习惯?

通常只应测试公共接口.

但是,我发现在复杂计算过程中,调用大量不同的私有方法,首先对私有方法进行单元测试更容易,然后对公共接口方法进行简单测试.

举个例子,假设你有一个音频播放器,你有功能:

void play(){ ... }
void pause(){ ... }
void seek(time t)
{
    //All Private methods
    checkIfValidTimeRange(...);
    moveToFilePos(...);    
    fillBuffers(...);      
}
Run Code Online (Sandbox Code Playgroud)

通常我会编写单元测试:checkIfValidTimeRange(...),moveToFilePos(...), fillBuffers(...).

但我不确定这样做是不是很好.

c++ unit-testing private

13
推荐指数
2
解决办法
4363
查看次数

单元测试私有方法:Facade模式

许多开发人员认为测试私有方法是个坏主意.但是,我发现的所有示例都基于私有方法是私有的,因为调用它们可能会破坏内部对象的状态.但这不仅是隐藏方法的理由.

我们来看看Facade模式.我的班级用户需要2种公共方法.它们太大了.在我的示例中,他们需要从数据库的BLOB加载一些复杂的结构,解析它,填充一些临时COM对象,运行用户的宏来验证和修改这些对象,以及将修改后的对象序列化为XML.单个metod的相当大的功能:-)这两个公共方法都需要这些操作.所以,我创建了大约10个私有方法,并且有2个公共方法可以调用它们.实际上,我的私人方法不一定是私人的; 他们不会破坏实例的内部状态.但是,当我不习惯测试私有方法时,我有以下问题:

  1. 发布它们意味着用户的复杂性(他们有一个他们不需要的选择)
  2. 我无法想象TDD风格如此庞大的公共方法,当你要编写500多行代码只是为了返回一些东西(甚至不是真正的结果).
  3. 从数据库中检索这些方法的数据,并且测试与DB相关的功能要困难得多.

当我测试私有方法时:

  1. 我不会发布会让用户感到困惑的细节.公共接口包括2种方法.
  2. 我可以用TDD风格工作(逐步编写小方法).
  3. 我可以使用测试数据覆盖大部分类的功能,而无需数据库连接.

有人可以形容,我做错了什么?我应该使用什么样的设计来获得相同的奖金,而不是测试私人方法?

更新:在我看来,我已经提取了我能够进行的其他课程.所以,我无法想象我还能提取什么.从数据库加载由ORM层执行,解析流,序列化为XML,运行宏 - 一切都由独立类完成.该类包含非常复杂的数据结构,搜索和转换的例程,以及对所有提到的实用程序的调用.所以,我不认为可以提取其他东西; 否则,它的责任(关于数据结构的知识)将在类之间划分.

所以,我现在看到的最好的解决方法是分成两个对象(Facade本身和真实对象,私有方法变为公共)并将真实对象移动到某个地方,没人会试图找到它.在我的情况下(Delphi)它将是一个独立的单元,在其他语言中它可以是一个单独的名称空间.其他类似的选项是2个接口,感谢您的想法.

tdd unit-testing

8
推荐指数
1
解决办法
4428
查看次数

如何使课程更可测试?

我有这个:

 class FooGenerator:IFooGenerator {
      private object _generated;

      public void Generate() {
         // Generating
         GenerateSmallPart();
         GenerateOtherSmallPart();
         GenerateTinyPart();
         // A lot similar
      }

      private void GenerateSmallPart() {
         //add small part to _generated
      }

      private void GenerateOtherSmallPart() {
         //add small part to _generated
      }

      private void GenerateTinyPart() {
         //add small part to _generated
      }
   }

   internal interface IFooGenerator {
      void Generate();
   }
Run Code Online (Sandbox Code Playgroud)

在我的应用程序中,我只IFooGenerator使用IoC,但我想测试所有这些子方法.

正如我在这里找到的,一个选项是使用所有子方法提取类.但为什么我需要这样做.它只被用于FooGenerator.

您有什么建议我如何让我的课程更可测试?

.net c# oop unit-testing encapsulation

6
推荐指数
1
解决办法
1322
查看次数