有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

未调用java Mockito存根方法

我是莫基托的新手,在打短发方面遇到了麻烦。我想测试一个方法,但在该方法的一行上存根,这是对另一个类的方法的调用。根据下面的代码,我希望是可选的。empty(),但得到可选值。of(“str不应为空”)。我做错了什么

public class ClassA {
    public String str;

    public Optional<String> method1() {
        if (str == null) { 
            return Optional.of("str should not be null"); 
        }
        return Optional.empty();
    }
}
        
public class ClassB {
    public String thing;
    public Optional<String> method2() {
        ClassA classA = new ClassA();
        Optional<String> str2 = classA.method1();
        if (str2.isPresent()) return str2;
        if (thing == null) return Optional.of("thing should not be null");
        return Optional.empty();
    }
}

public class ClassBTest {
    @Test
    public void method1_test() {
        ClassB classBSpy = spy(new ClassB());
        ClassA classASpy = spy(new ClassA());
        doReturn(Optional.empty()).when(classASpy).method1();

        assertEquals(Optional.empty(), classBSpy.method2());
    }
}
        

共 (2) 个答案

  1. # 1 楼答案

    为了使ClaasB中的ClassA存根有效,您需要一种将ClassA的Spy/Mock插入CLassB的方法,即通过构造函数:

    public class ClassB {
        public String thing;
    
        private ClassA classA = new ClassA();
    
        public ClassB() {
            super();
        }
    
    
        public ClassB(ClassA classA) {
            super();
            this.classA = classA;
        }
    
        public Optional<String> method2() {
            Optional<String> str2 = classA.method1();
            if (str2.isPresent()) return str2;
            if (thing == null) return Optional.of("thing should not be null");
            return Optional.empty();
        }
    }
     
    
    public class ClassBTest {
        @Test
        public void method1_test() {
            ClassA classASpy = spy(new ClassA());
            ClassB classB = new ClassB(classASpy);
            doReturn(Optional.empty()).when(classASpy).method1();
    
            assertEquals(Optional.empty(), classB.method2());
        }
    }
    

    但是测试仍然失败,因为Optional.empty().isPresent()false,而thingnull

  2. # 2 楼答案

    您在这里提供的测试似乎执行成功,我不是Mockito专家,但我认为这主要是因为它将根据方法签名简单地存根方法,返回可选。空()并且不关心演员阵容

    如果我理解正确的话,如果您想存根该方法的超级调用,我认为Mockito不支持这一点。关于这个here有一条线索。不过,你可以求助于PowerMockito,我相信它可能有这样的能力