抽象类中调用其非抽象超类方法的方法的 Junit 测试用例

问题描述 投票:0回答:1

我有一个家长班家长

    class Parent{
        public String calculate(String input){
           // does lots of external system calls and complex calculations
        }
    }

然后我有一个抽象类,它扩展了父母。

public abstract class AbsChild extends Parent{
    
    public String calculatePayments(String abc, String xyz){
       
        String ZXC = doSomething(abc);
        // more code
    }
    
    private String doSomething(String abc){
       
        String STR = super.calculate(abc);
        // more code
    }
}

现在我需要为这个calculatePayments 方法编写一个测试用例。我嘲笑了 super.calculate(abc) 但它仍然调用真正的方法并抛出异常。 这是我尝试过的。

public class AbsChildTest extends AbsChild{

     @Test
     public void testCalculatePayments(){
   
         Parent parent = mock(Parent.class);
         when(parent.calculate(anyString())).thenReturn("str");
         this.calculatePayments("abc", "xyz");

     }

}

这总是调用真正的方法,该方法调用了许多外部系统。不使用PowerMock可以实现吗?

java junit mockito abstract-class
1个回答
0
投票

这不起作用,因为代码中的“this”对象会转换为 JVM 代表“this”调用超级方法calculate()。并且“this”是一个“真实对象”,而不是一个模拟对象。您需要以某种方式将模拟注入执行中。下面是一个使用包装器作为被测系统的示例: public class AbsChildTest { // System Under Test (sut) private class AbsChildWrapper extends AbsChild { // provide methods and constructors from AbsChild required to be overidden } @Test public void testCalculatePayments(){ AbsChildWrapper sut = Mockito.spy(new AbsChildWrapper()); Mockito.when(sut.calculate(ArgumentMatchers.anyString())).thenReturn("str"); String result = sut.calculatePayments("abc", "xyz"); Assertions.assertEquals("str", result); } }

	
© www.soinside.com 2019 - 2024. All rights reserved.