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或反射。。。