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