2015-11-03 35 views
0

我有2个问题:与私有方法(白箱测试)方法处理很多条件

1)在JUnit中,你不应该测试或模拟私有方法。但是如何处理,当他们在公共方法中被调用时。假设我有以下设置:

public void method(String value){ 
    if(value.contains("something")){ 
     doSomethingToString(value); 
    } 
    else{ 
     //do something else 
    } 
} 

private void doSomethingToString(String value){ 
    Object obj = service.getObject(); //service is mocked in my test-class 
    //do something with the obj and value 
} 

我在做一个白盒测试,所以我知道方法和发生了什么。现在我想测试公共方法method(String value)。当我现在只考虑发生在那里的事情时,我会陷入困境,因为我需要影响私人方法返回的service.getObject()。是否可以,当我继续时,就像我愿意的那样,意思是使用doReturn(objectICreatedInMyTestClass).when(service.getObject())还是需要另寻方式?

2)具有多个条件的方法。例如:

public void method(String value){ 
    if(value.contains("something")){ 
     Object obj = service.getObj(value); 
    } 
    else{ 
     //do something else 
    } 

    if(obj.getAddress == null){ 
     //do something 
    } 
    else{ 
     //do something else 
     } 

    if (obj.getName == "Name") { 
     // do something 
    } 
    else 
    { 
     // do something else 
    } 
} 

需要多少次测试此方法?只有两次,一旦所有条件都恢复正常,其次,它们都返回错误?还是建议测试每种可能的情况?这意味着条件1 =真,条件2 =假,条件3 =假,然后条件1 =真,条件2 =真,条件3 =假等等(= 8个可能性)的测试。

+1

可能使用http://stackoverflow.com/questions/34571/how-to-test-a-class-that-has-private-methods-fields-or-inner-classes。这就是说,是的,你应该测试你的代码的各个分支。 https://en.wikipedia.org/wiki/Code_coverage#Basic_coverage_criteria –

+0

我在那里的问题是,他们只使用一个条件。当我在第一次测试时,例如我有value =“Stringsomething”,obj.getAddress等于null,obj.getName等于“Name”,那么我是否有完整的分支覆盖?我有所有的条件设置为true。而在第二个测试中,我设置了value =“String”,obj.getAddress!= null和obj.getName(“String”),所以现在他们都覆盖了两个测试。但是,我仍然需要覆盖所有其他可能性吗? – user5417542

回答

1

1)我应该自己测试私有方法,除了调用它们的公共方法之外吗?

通常我会一直遵循如下假设:如果您的代码访问该方法的唯一方法是通过另一个方法,那么应该如何测试它。我对测试系统的经验使我相信,这通常是在'真实世界'中完成的方式。

如果我们以您为例,我们可以假设我们的第一步是编写测试来彻底测试我们的主要方法。作为其中的一部分,我们应该测试场景,包括正确运用我们所期望的所有条件。这将包括您的私有方法将面临的至少一部分场景。

您的私有方法可能被多个(可能是非常不同的)方法使用,因此其可能的输入和输出的空间可能会大于使用它的任何单个公共方法。但是,如果您彻底测试了使用它们的公共方法,那么您应该处于测试该私有方法将遇到的所有可能场景的情况。

因此,您不应该专门为私有方法编写测试。在尝试和测试私有方法或私有类时,可能还有其他一些情况是不可避免的。通常我会认为这是因为代码的编写方式很难/不可能,并且可以重写代码以使其对测试更友善(因此稍后更新/重构更友好)。

2)是否应该测试所有这些组合?

这取决于示例中发生的情况。有两种不同的情况需要考虑:

a)这些分支都没有任何关系。也就是说,第一组分支发生的事情将无法影响第二分支发生的逻辑。

b)在第一组分支中运行任何逻辑的一些可能的影响会导致在一个或多个第二分支中的代码逻辑中产生不同的结果。

这将归结于您的阅读和理解代码中发生了什么,所以您的示例不足以指出某种做法或其他方式。

+0

非常感谢。要点2):在我的情况下,这些分支之间没有依赖关系。所以第一个条件不会影响第二个条件等等。 – user5417542

+0

在这种情况下,您可能没有测试所有这些不同的组合。还有一点需要记住的是,您通常需要尽可能多的代码覆盖率,但是100%的代码覆盖率并不意味着您正在测试单元测试所需的所有内容。 – Seb

+0

你说theres在分支没有依赖关系,但是你提供/至少有一个依赖关系的例子 - 第一个分支是获取后续分支中使用的对象 – tddmonkey