Java Junit:测试方法中的If子句

Java Junit:测试方法中的If子句,java,junit,Java,Junit,对于我的应用程序,我有一个函数处理程序,如下所示: class MyFoo { private MyFoo2 myFoo2 = new MyFoo2(); public void handler(Object o) { if (o.getName().equals("Name1")) { myFoo2.doSomeStuff1(o); } else if (o.getName().equals("Name2")) {

对于我的应用程序,我有一个函数
处理程序
,如下所示:

class MyFoo {

    private MyFoo2 myFoo2 = new MyFoo2();

    public void handler(Object o) {

        if (o.getName().equals("Name1")) {
            myFoo2.doSomeStuff1(o);
        } else if (o.getName().equals("Name2")) {
            myFoo2.doSomeStuff2(o);
        }
    }
}

class MyFoo2{

    List<Object> objectList=new ArrayList<>();

    public void doSomeStuff1(Object o){
        //prepare Object o I
        objectList.add(o);
    }

    public void doSomeStuff2(Object o){
        //prepare Object o II
        objectList.add(o);
    }

    public getObjectList(){
        return objectList;
    }
}
类MyFoo{
私有MyFoo2 MyFoo2=新的MyFoo2();
公共无效处理程序(对象o){
if(o.getName().equals(“Name1”)){
myFoo2.doSomeStuff1(o);
}else if(o.getName().equals(“Name2”)){
myFoo2.doSomeStuff2(o);
}
}
}
类MyFoo2{
List objectList=new ArrayList();
公共无效doSomeStuff1(对象o){
//准备对象o I
添加(o);
}
公共无效doSomeStuff2(对象o){
//准备对象o II
添加(o);
}
公共getObjectList(){
返回对象列表;
}
}
现在我想用JUnit测试我的函数
处理程序
。为了测试它,我应该从我的
MyFoo2
中获取
objectList
并检查条目,还是有其他方法来检查类似的函数? 这里有什么好的测试方法?
这样的考试没有必要吗?

我认为答案在于你的问题本身:

Should i have to get the objectList from my MyFoo2 and check the entry?
这是否意味着您需要在自己的单元测试中测试
MyFoo2
类的方法
doSomeStuff1

是的,您为类
MyFoo2
创建了单元测试,并在它自己的单元测试类中执行与该类相关的所有测试,而不是将其作为另一个测试类的一部分进行测试

更新:


当单元测试
处理程序
方法时,您应该只测试它是否调用了
myFoo2
对象(
doSomeStuff1
doSomeStuff2
)上的适当方法,具体取决于测试。您可以对
myFoo2
使用mockito之类的mocking util,并验证对该mock对象调用了
doSomeStuff1
doSomeStuff1

既然您在谈论单元测试,正确的测试方法应该是不使用
myFoo2

您正在测试
MyFoo1
,因此可以模拟
MyFoo2
,并使用它来验证执行情况。比如:

public class MyFoo1Test {

  @Mock private MyFoo2 mockMyFoo2;

  @InjectMocks
  private MyFoo1 myFoo1 = new MyFoo1();

  @Test
  public void testHandlerName1() {
    Object o = new Object("Name1"); 
    myFoo1.handler(o);
    verify(myFoo2).doSomeStuff1(o);
  }

  @Test
  public void testHandlerName2() {
    Object o = new Object("Name2"); 
    myFoo1.handler(o);
    verify(myFoo2).doSomeStuff2(o);
  }

  @Test
  public void testHandlerOtherName() {
    Object o = new Object("OtherName"); 
    myFoo1.handler(o);
    verifyZeroInteractions(myFoo2);
  }

}

MyFoo2
的单元测试应该单独进行,在那里你应该测试
doSomeStuff
方法在你的例子中,如果我要做一个“真正的”单元测试,我会通过在内部注入一个mock来隔离MyFoo2实例,在我的JUnit断言中,我会断言当好的o.getName()时调用MyFoo2.doSomeStuff1(o)存在。

是。还要为handler方法添加单元测试用例。以确保涵盖“如果其他”条件

在Jesper的评论中还添加了, 1) 在比较期间从对象获取值之前,始终执行空指针检查 或 2) 把它移到比较的右边

例如:“Name1”.equals(o.getName())


请考虑此为注释,因为我还没有获得注释的注释< /p>注释:比较字符串与==< /> >不符合java中的想法。请看:@Jesper:谢谢你的提示:如果你对学习感兴趣。。。考虑去除这样的if语句。事实上,在好的OO设计中,你不会做“如果”。。。但是你使用多态性。请看,我知道我必须在额外的单元测试中检查

doSomeStuff1
。但是我还想检查
处理程序
,或者它是不必要的?在您的实现中,myFoo2模拟与myFoo1没有关联。因此,模拟无法工作。此外,为什么要将问题耦合到特定的模拟实现?这是莫基托,我说的。此代码无法工作。必须将MyFoo2实例与MyFoo1实例相关联。您可以使用构造函数、setter或反射。。。