Java 抽象方法的Junit测试用例失败

Java 抽象方法的Junit测试用例失败,java,spring,junit,mockito,Java,Spring,Junit,Mockito,我有一个抽象方法checkStatus(),它在Checker.java类中有实现。但是,当我在抽象类方法validate()上执行Junit测试用例时,由于Checker.java类中缺少spring依赖关系,该方法反过来调用checkStatus(),因此失败 详情如下 抽象类: public abstract class MyAbstractClass { protected abstract boolean checkStatus(); public boolean v

我有一个抽象方法
checkStatus()
,它在Checker.java类中有实现。但是,当我在抽象类方法
validate()
上执行Junit测试用例时,由于Checker.java类中缺少spring依赖关系,该方法反过来调用
checkStatus()
,因此失败

详情如下

抽象类:

public abstract class MyAbstractClass
{
    protected abstract boolean checkStatus();

    public boolean validate()
    {
        //Some code
        return checkStatus();
    }
}
实现类:

public class Checker extends MyAbstractClass
{
    @Autowired
    private StatusHelper helper;

    public void setHelper(StatusHelper helper){
        this.helper = helper;
    }

    @Override
    public boolean checkStatus() throws Exception{
        if(null == helper){
            throw new Exception("Helper is null");
        }

        return helper.validateStatus();
    }
}
JUnit测试:

class AbstractClassTest
{
    MyAbstractClass absClass = Mockito.mock(Checker.class, Mockito.CALLS_REAL_METHODS);

    @Test
    public void testStatusOfChecker()throws Exception {
        boolean status = absClass.validate();
        assertEquals(status, true);
    }
}
我相信我可以像下面这样手动注入helper对象

Checker check = mock(Checker.class);
StatusHelper helper = mock(StatusHelper.class);
check.setHelper(helper);
但是这里的问题是,我不能直接注入
absClass
对象,因为
setHelper()
不是继承的

我可以直接将测试用例编写到子类,但我需要用这种方法来测试抽象类的
validate()
方法中的一些其他功能

有人能帮助我如何将helper对象设置为子类吗?或者在Junit中有不同的方法吗?任何包含相关信息的帮助或链接都是非常值得欣赏的。
谢谢,

测试抽象类的唯一方法是测试实现(可能是匿名类)

如果要测试
检查器
实现,则不能对其进行模拟

public class CheckerTest {
  @Test
  public void test() {
    StatusHelper helper = mock(StatusHelper.class);
    Checker checker = new Checker();
    checker.setHelper(helper);
    when(helper.validate()).thenReturn(true);
    boolean status = checker.validate();
    assertEquals(status, true);
  }
}
顺便提一下,我强烈建议使用构造函数注入(请参阅)。测试结果将是这样的

public class CheckerTest {
  @Test
  public void test() {
    StatusHelper helper = mock(StatusHelper.class);
    Checker checker = new Checker(helper);
    when(helper.validate()).thenReturn(true);
    boolean status = checker.validate();
    assertEquals(status, true);
  }
}
public class CheckerTest {
  @Test
  public void test() {
    StatusHelper helper = mock(StatusHelper.class);
    Checker checker = new Checker(helper);
    when(helper.validate()).thenReturn(true);
    boolean status = checker.validate();
    assertEquals(status, true);
  }
}